Class 多态性到底是什么?

Class 多态性到底是什么?,class,oop,object,inheritance,polymorphism,Class,Oop,Object,Inheritance,Polymorphism,我试图确切地理解OOP中多态性的含义。我读过的所有教程都说了几乎相同的内容: “多态性是指如果A类继承/扩展B类,则A类的对象可以称为A类的对象或B类的对象。” 因此,如果在游戏中我有几种类型的导弹,它们都扩展了导弹类,我可以创建一个导弹s数组,它们都可以在里面,因为它们都是导弹s,即使它们直接是速度导弹或EXLPODING导弹或任何东西 这就是多态性的定义吗?就这些吗?它被认为是OOP的一个主要原则,但不知何故,我不明白为什么它如此重要。而且,本质上这只是继承原则的结果。那么为什么它如此重要呢

我试图确切地理解OOP中多态性的含义。我读过的所有教程都说了几乎相同的内容:

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

因此,如果在游戏中我有几种类型的导弹,它们都扩展了
导弹
类,我可以创建一个
导弹
s数组,它们都可以在里面,因为它们都是
导弹
s,即使它们直接是
速度导弹
EXLPODING导弹
或任何东西

这就是多态性的定义吗?就这些吗?它被认为是OOP的一个主要原则,但不知何故,我不明白为什么它如此重要。而且,本质上这只是继承原则的结果。那么为什么它如此重要呢?

Shape->draw()是一种多态方法。 它的实现根据形状的类型而改变,因此命名为poly=many morphic=forms。 GraphicsEditor可以绘制任何形状,只要它实现draw()方法

在现实生活中,任何人都可以驾驶汽车,只要它具备(即实施)这些基本操作,例如刹车()、加速()、向右转弯()和向左转弯()以及转向反向()。宝马和本田的刹车方法可能完全不同,但最终结果是相同的,即停车


想象一下,如果没有标准的界面,每辆车都有不同的驾驶控制,那会是一种混乱。

实际上多态性不是继承的结果,也不意味着也不需要另一种。在流行的编程语言中,它们确实倾向于同时出现,但从技术上讲,这两种思想是正交的

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

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

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

这就是多态性的定义吗?就这些吗

是的,你完全正确。仅此而已。有时简单的概念有听起来很难的名字。重要的是不要忘记这个词最初是在1967年创造的。这意味着它是在计算机庞大、昂贵、难以理解、主要由科学家操作的机器的时代发明的

它被认为是OOP的一个主要原则,但不知何故,我不明白为什么它如此重要。而且,本质上这只是继承原则的结果。那为什么这么重要呢

假设你想发射你刚才说的所有导弹。在支持多态性的语言中,您只需为(导弹中的m)m.fire()编写
。在不需要的语言中,您必须单独发射每种类型的导弹,例如
speedsmail.fire
exlpodingsmail.fire
scumissile.fire
将不是同一形式(变形)的多个(poly)方法


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

我认为维基百科给出了最好的答案:

简而言之:您有更多相同类型的对象,它们的行为不同

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

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

检查,这就是我所说的多态性是继承原则的一个后果或一部分时的意思。如果这个原则仅仅是从继承中衍生出来的,那么为什么它本身如此重要呢?
Type reference = new TypeOrSubclassesOfTypeObject();
Type anotherReference = new AnotherTypeOrSubclassesOfTypeObject();