【问题标题】:What exactly is Polymorphism?究竟什么是多态性?
【发布时间】:2014-03-11 21:56:45
【问题描述】:

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

'多态性是这样一个事实,即如果class A 继承/扩展class B,则class A 的对象可以被称为class A 的对象或class B 的对象' .

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

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

【问题讨论】:

标签: class oop object inheritance polymorphism


【解决方案1】:

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

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

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

假设你想发射你所说的所有导弹。在支持多态的语言中,您可以简单地编写for(m in missiles) m.fire()。在不需要的语言中,您必须单独发射每种类型的导弹,因为SpeedMissile.fireExlpodingMissile.fireScudMissile.fire 不会是相同形式的多个(多)方法(变形)。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这就是我所说的多态性是继承原则的结果或一部分时的意思。如果这个原则仅仅是从继承中衍生出来的,那为什么它本身就这么重要呢?
    【解决方案3】:

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

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

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

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

    Polymorphism vs Inheritance

    Polymorphism - Define In Just Two Sentences

    【讨论】:

      【解决方案4】:

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

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

      在现实生活中,任何人都可以驾驶汽车,只要它具有(即实现)这些基本操作,例如刹车(),加速(),转右()和转左()和goInReverse()。在 BMW 和 Honda 中实现刹车()方法的方式可能完全不同,但最终结果是相同的,即停止汽车。

      想象一下,如果没有标准接口并且每辆车都有不同的驾驶控制装置,那会是多么混乱。

      【讨论】:

        猜你喜欢
        • 2018-12-26
        • 2014-10-28
        • 2012-08-27
        • 2010-11-12
        • 2011-03-18
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多