我在维基百科和其他文本中看到以这种方式给出多态的例子:
1)如果有一个包含4个Animal对象的数组,它们实际上是Bird,Dog,Cat,Fish类,然后循环遍历它们,并调用 animal.move()
,(其中动物是一般动物指针),那么这将是多态的 .
2)如果我有一个Dog对象,但我将它传递给普通函数 moveIt(Animal *animal)
并在里面,它使用 animal.move()
来调用 move()
,我们也可以传入一个Fish对象(通过 moveIt(fish)
),它也会做正确的事情那是多态性 .
我认为没关系,这些例子显示了一个通用的动物对象能够(明智地)调用适当的方法作为狗或鱼,这就是多态性 .
但是在JavaScript或Ruby等语言中,数组元素可以是任何类型 . 所以它不是一个包含4个动物对象的数组,而是一个 [bird, dog, cat, fish]
的数组,现在我们遍历数组并调用它:
# In Ruby:
bird = Bird.new()
dog = Dog.new()
cat = Cat.new()
fish = Fish.new()
arr = [bird, dog, cat, fish]
arr.each do |i|
i.move()
end
现在在这种情况下,因为它们从未成为动物,当然我们希望 dog.move()
能够像狗一样行动,所以在这种情况下,它仍然是多态的吗?
2 回答
是的,它是运行时多态性,即 . 不是基于继承 . 从技术上讲,它被称为鸭子打字,例如,如果它像鸭子一样走路,那就像鸭子一样......
对象都具有move()方法,因此语言允许仅通过方法签名进行动态调用 .
https://en.m.wikipedia.org/wiki/Duck_typing
许多人都熟悉的基于继承的多态性是当子类重写其中一个超类的一个或多个方法的行为时 . 调用该方法时,将根据对象类执行特定的子类实现 .
不,因为它们并非都从相同的基类继承 .
您想要用来描述这个术语的术语是duck typing . 你给出的代码示例的工作原因是 only ,因为它很可能(可能是你的设计)发生了数组中的每个对象都有适当的方法 .