多态性到底是什么?

时间:2014-02-13 06:51:54

标签: class oop object inheritance polymorphism

我试图准确理解OOP中的多态性意味着什么。我读过的所有教程都说了几乎相同的东西:

'多态性是指如果class A继承/扩展class B,则class A的对象可以被称为class A的对象或class B'的对象。

因此,如果在游戏中我有几种类型的导弹,并且它们都扩展了Missile类,我可以创建一个Missile的数组,它们都可以在其中,因为它们都是Missile的所有类型,即使直接它们是SpeedMissileExlpodingMissile或其他。

这是多态性的定义吗?这就是全部?它被认为是OOP的一个主要原则,但不知怎的,我无法弄清楚为什么它如此重要。而且,基本上它只是继承原则的结果。那为什么这么重要呢?

4 个答案:

答案 0 :(得分:2)

  

这是多态性的定义吗?这就是全部吗?

是的,你已经完全正确了。 就是这样。有时候简单的概念会有很难听到的名字。重要的是不要忘记这个术语是在1967年首次创造出来的。意思是它是在计算机时发明的,是一种非常难以理解的机器,主要由科学家操作。

  

它被认为是OOP的主要原则,但不知怎的,我无法弄清楚它为何如此重要。而且,基本上它只是继承原则的结果。那为什么这么重要呢?

假设您要发射所有正在谈论的导弹。在支持多态的语言中,您只需编写for(m in missiles) m.fire()即可。在没有语言的情况下,您必须单独触发导弹的每个类型,因为SpeedMissile.fireExlpodingMissile.fireScudMissile.fire不会是多个(多边)方法相同的形式(变形)。

这对我来说似乎很重要。多态性是几乎所有OO design patterns的基础。如果没有多态性,你就无法创建工厂,访问者,策略,适配器,访问者等。总之,没有多态性的OOP会很糟糕。

答案 1 :(得分:1)

Shape-> draw()是一种多态方法。 它的实现基于形状类型而变化,因此名称poly = many morphic = forms。 然后GraphicsEditor可以绘制任何Shape,只要它实现draw()方法。

for (shape : shapeList) {
    shape->draw();
}

在现实生活中,任何人都可以驾驶汽车,只要它具有(即实施)这些基本操作即可。 brake(),accele(),turnRight()和turnLeft()以及goInReverse()。如何在宝马与本田实施制动()方法可能完全不同,但最终结果是相同的,即停车。

想象一下,如果没有标准接口,每辆车都有不同的驾驶控制,那就会出现混乱。

答案 2 :(得分:1)

实际上,多态性不是继承的结果,实际上也不暗示或要求另一种。它们确实倾向于在流行的编程语言中一起出现,但从技术上讲,这两个想法是正交的。

多态性意味着在不知道特定类型的情况下,可以以类似的方式使用多种类型的对象。在Java和C#中,接口是这个想法的最简单的例子。请注意,接口没有任何继承性。

继承意味着一种类型的对象的行为可以自动包含在其他类型中。显然,最简单的例子是子类化。但是,这不是自动多态的吗?否 - 如果子类没有覆盖父类行为(或者父类不允许它,即在C#中没有将父类方法标记为虚拟),则实际上不涉及多态。

还可以看到一些类似的问题并得到很好的答案:

Polymorphism vs Inheritance

Polymorphism - Define In Just Two Sentences

答案 3 :(得分:1)

我认为维基百科提供了最佳答案:wiki

在一个坚果中:你有更多相同类型的对象表现不同。

Type reference = new TypeOrSubclassesOfTypeObject();
Type anotherReference = new AnotherTypeOrSubclassesOfTypeObject();

在这种情况下,对象将始终具有相同的类型Type,但它们的行为将在子类中定义。