0

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

4

3 回答 3

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 也鼓励使用鸭子类型,这可能是关于正确支持多态性问题的混淆来源。

于 2013-04-08T17:00:08.453 回答
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"

只要响应a,函数就会按预期输出。查看更多关于 Duck Typing 的示例。bto_s

于 2013-04-08T17:00:28.983 回答
0

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

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

于 2013-04-08T22:51:00.227 回答