Ruby中存在多态吗?

时间:2013-04-08 16:50:27

标签: ruby polymorphism

Ruby中是否存在多态?我已经读过Ruby不支持多态,而是支持方法重载和方法覆盖。有人可以通过一个例子为我澄清这个吗?

3 个答案:

答案 0 :(得分:4)

是的,Ruby确实支持多态性。

考虑简单类继承的情况,其中派生类"的实例是"子类和父类的实例:

class Parent; end
class Child < Parent; end
o = Child.new
o.is_a?(Child) # => true
o.is_a?(Parent) # => true

请注意,此示例对包含的模块也有效:

a = Array.new
a.is_a?(Array) # => true
a.is_a?(Enumerable) # => true

当然,Ruby也鼓励duck typing,这可能是正确支持多态性问题混淆的根源。

答案 1 :(得分:1)

Ruby是一种高度多态的语言,在某种意义上,只要对象的行为与预期一致,方法就不会自动推断出传递给它们的数据类型。例如:

def concat(a,b)
  a.to_s + b.to_s
end

concat('a', 'bcd')              #=> "abcd"
concat(5, 10)                   #=> "510"
concat([1,2,3], ' is an Array') #=> "[1, 2, 3] is an Array"

只要ab回复to_s,该函数就会按预期输出。有关示例,请查看有关Duck Typing的更多信息。

答案 2 :(得分:0)

Ruby不支持方法重载。方法重载的想法在动态类型语言中甚至没有意义。

Ruby 确实支持ad-hoc多态,就像地球上几乎所有面向对象的语言一样。