- 论坛徽章:
- 0
|
转:dtzq01
ruby有重载和重写么?
自己学习整理下,希望大家共同探讨。
首先看看在它们在java中的定义:
Java中,重载(overload)和重写(override)是用来表现多态性的两种重要方式。override也有译作“覆盖”、“覆写”。Java中称作“覆写”比较恰当。
重载方法是指一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。
覆写方法是指子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时绘调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。
ruby有重载吗?
先看一个例子,实现一个类属性的可读写:
Ruby代码- class A
- def para(a)
- @para = a
- end
- def para
- @para
- end
- end
- a = A.new
- a.para(1)
- 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代码- class A
- def para
- @para
- end
- def para(a)
- @para = a
- end
- end
- a = A.new
- a.para(1)
- 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代码- class A
- def para(*a)
- @para = a.first if a.size == 1
- @para
- end
- end
- a = A.new
- a.para(2)
- puts a.para
复制代码 结果:
>ruby test.rb
2
>Exit code: 0
难道这个就是java中的重载在ruby中的实现?
那么重写呢?
看例子:
Ruby代码- class A
- def ow
- puts "Father"
- end
- end
- class B < A
- def ow
- puts "I am!"
- end
- end
- b = B.new
- b.ow
复制代码 结果:
>ruby test.rb
I am!
>Exit code: 0
但是有个东西就有点纠结了!
Ruby代码- class A
- def ow
- puts "Father"
- end
- end
- class B < A
- def ow(name)
- puts "I am!" + name
- end
- end
- b = B.new
- b.ow("Jack")
- 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) |
|