多态(polymorphism),重载(overloading),覆盖(overriding)和ruby

[复制链接]
查看11 | 回复0 | 2006-8-16 21:32:00 | 显示全部楼层 |阅读模式
只要是面向对象(OO)的语言,就必须具备多态性。
多态指的是编程语言提供的依赖的某个对象(object)的数据类型(data type)或者类(class),来处理这个对象(object)的能力

在ruby里面的实现方法是,根据被调用的对象的不同来选择不同的方法:
obj = "abc"
print obj.length, "\n"
# => 3
obj = [1,2,3,4]
print obj.length, "\n"
# => 4
所谓的多态性,这里具体表现为,不同的object,在调用同名method,选择了不同的实现(String class 和 Array class 分别有length method的实现方式)


overloading(重载):method经过overloading,将可以接受不同个数的参数(同名不同参)。有些文献认为overloading是polymorphism的一种,overloading导致的实际上的不同的处理方式是由于arguments引起的,而非object,也就是,我们并没有通过object所属的type或者class来选择不同的处理方式。ruby中就没有overloading,比如:

class Test
def a
p "0 arg"
end
def a(a1)
p "1 arg"
end
def a(a1,a2)
p "2 args"
end
end
Test.new.a

结果:in `a': wrong number of arguments (0 for 2) (ArgumentError)
from -:12


很多的文章提到,ruby支持运算符重载,实际上,ruby是通过调用运算符的object,来判断使用哪一个class的运算符,这是多态的表现,并不存在的重载形式:
class Fixnum
def ==(a)
end
def ==
p "hi"
end
end
1==1
^Z
-:8:in `==': wrong number of arguments (1 for 0) (ArgumentError)
from -:8


所谓的重载:
class Fixnum
def ==(a)
"overriding"
end
end
p 1==1
p 0.1==0.1
^Z
"overriding"
true

这里,前面的object,决定如何使用哪一个类的运算符

overriding(覆盖):ruby中也叫做redefinition,覆盖现有方法,使得现有方法不可见,ruby只要定义方法,要么添加了一个新的方法,要么发生覆盖。覆盖是属于多态的一种。


有些文章对多态进行更加复杂的分类,有些把overloading归结到polymorphism,似乎也是比较合理的,然ruby的弱类型,决定了ruby中对于3个概念比较不重要的依赖,作为ruby的使用者,只要明白:“ruby只要定义方法,要么添加了一个新的方法,要么发生覆盖”(运算符也认为是一种方法),ruby调用method的时候,先在调用它的object里面寻找这个method,如果没有,再进入父类找,一直继续下去,到了Ojbect还没有这个method,就会出现NameError
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行