我试图准确理解OOP中的多态性意味着什么。我读过的所有教程都说了几乎相同的东西:
'多态性是指如果class A
继承/扩展class B
,则class A
的对象可以被称为class A
的对象或class B
'的对象。
因此,如果在游戏中我有几种类型的导弹,并且它们都扩展了Missile
类,我可以创建一个Missile
的数组,它们都可以在其中,因为它们都是Missile
的所有类型,即使直接它们是SpeedMissile
或ExlpodingMissile
或其他。
这是多态性的定义吗?这就是全部?它被认为是OOP的一个主要原则,但不知怎的,我无法弄清楚为什么它如此重要。而且,基本上它只是继承原则的结果。那为什么这么重要呢?
答案 0 :(得分:2)
这是多态性的定义吗?这就是全部吗?
是的,你已经完全正确了。 就是这样。有时候简单的概念会有很难听到的名字。重要的是不要忘记这个术语是在1967年首次创造出来的。意思是它是在计算机时发明的,是一种非常难以理解的机器,主要由科学家操作。
它被认为是OOP的主要原则,但不知怎的,我无法弄清楚它为何如此重要。而且,基本上它只是继承原则的结果。那为什么这么重要呢?
假设您要发射所有正在谈论的导弹。在支持多态的语言中,您只需编写for(m in missiles) m.fire()
即可。在没有语言的情况下,您必须单独触发导弹的每个类型,因为SpeedMissile.fire
,ExlpodingMissile.fire
和ScudMissile.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#中没有将父类方法标记为虚拟),则实际上不涉及多态。
还可以看到一些类似的问题并得到很好的答案:
答案 3 :(得分:1)
我认为维基百科提供了最佳答案:wiki。
在一个坚果中:你有更多相同类型的对象表现不同。
Type reference = new TypeOrSubclassesOfTypeObject();
Type anotherReference = new AnotherTypeOrSubclassesOfTypeObject();
在这种情况下,对象将始终具有相同的类型Type
,但它们的行为将在子类中定义。