免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4468 | 回复: 2
打印 上一主题 下一主题

ruby有重载和重写么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-22 11:22 |只看该作者 |倒序浏览
转:dtzq01

ruby有重载和重写么?



自己学习整理下,希望大家共同探讨。
首先看看在它们在java中的定义:
Java中,重载(overload)和重写(override)是用来表现多态性的两种重要方式。override也有译作“覆盖”、“覆写”。Java中称作“覆写”比较恰当。

    重载方法是指一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。

    覆写方法是指子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时绘调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。

ruby有重载吗?
先看一个例子,实现一个类属性的可读写:

Ruby代码
  1. class A
  2.   def para(a)
  3.     @para = a
  4.   end
  5.   def para
  6.     @para
  7.   end
  8. end
  9. a = A.new
  10. a.para(1)
  11. puts a.para
复制代码
有错:
>ruby test.rb
test.rb:10:in `para': wrong number of arguments (1 for 0) (ArgumentError)
from test.rb:10
>Exit code: 1
很明显的,ruby用para方法覆盖了para(a)
稍微把para(a)和para方法定义的位置对调一下:

Ruby代码
  1. class A
  2.   def para
  3.     @para
  4.   end
  5.   def para(a)
  6.     @para = a
  7.   end
  8. end
  9. a = A.new
  10. a.para(1)
  11. puts a.para
复制代码
同样有问题:
>ruby test.rb
test.rb:11:in `para': wrong number of arguments (0 for 1) (ArgumentError)
from test.rb:11
>Exit code: 1
为什么会这样呢?
ruby支持可变参数,根本就没有必要定义两个同名的方法,只用在参数上面做文章就好了。

Ruby代码
  1. class A
  2.   def para(*a)
  3.     @para = a.first if a.size == 1
  4.     @para
  5.   end
  6. end
  7. a = A.new
  8. a.para(2)
  9. puts a.para
复制代码
结果:
>ruby test.rb
2
>Exit code: 0
难道这个就是java中的重载在ruby中的实现?

那么重写呢?
看例子:

Ruby代码
  1. class A
  2.   def ow
  3.     puts "Father"
  4.   end
  5. end
  6. class B < A
  7.   def ow
  8.     puts "I am!"
  9.   end
  10. end
  11. b = B.new
  12. b.ow
复制代码
结果:
>ruby test.rb
I am!
>Exit code: 0

但是有个东西就有点纠结了!

Ruby代码
  1. class A
  2.   def ow
  3.     puts "Father"
  4.   end
  5. end
  6. class B < A
  7.   def ow(name)
  8.     puts "I am!" + name
  9.   end
  10. end
  11. b = B.new
  12. b.ow("Jack")
  13. b.ow
复制代码
结果:
>ruby test.rb
test.rb:13:in `ow': wrong number of arguments (0 for 1) (ArgumentError)
from test.rb:13
I am!Jack
>Exit code: 1
在重载的时候时候也提到了,ruby是看"名字”来认识的,后面ow(name)方法已经把ow方法覆盖了!
由上可知,Ruby语言,只有重写(override),没有其它语言具有的严格意义上的重载(overload)

论坛徽章:
0
2 [报告]
发表于 2011-04-22 13:08 |只看该作者
Ruby的OO,比任何语言的OO还Magic、还强大!

论坛徽章:
0
3 [报告]
发表于 2011-05-05 11:54 |只看该作者
Magic
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP