Ruby中是否存在多态?我已经读过Ruby不支持多态,而是支持方法重载和方法覆盖。有人可以通过一个例子为我澄清这个吗?
答案 0 :(得分:4)
考虑简单类继承的情况,其中派生类"的实例是"子类和父类的实例:
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"
只要a
和b
回复to_s
,该函数就会按预期输出。有关示例,请查看有关Duck Typing的更多信息。
答案 2 :(得分:0)
Ruby不支持方法重载。方法重载的想法在动态类型语言中甚至没有意义。
Ruby 确实支持ad-hoc多态,就像地球上几乎所有面向对象的语言一样。