中关村村草 发表于 2011-04-22 11:22

ruby有重载和重写么?

转: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)

2gua 发表于 2011-04-22 13:08

Ruby的OO,比任何语言的OO还Magic、还强大!

cinanine 发表于 2011-05-05 11:54

Magic:em27:
页: [1]
查看完整版本: ruby有重载和重写么?