什么是多态性?它的用途是什么?

佐手、 提交于 2020-02-26 03:24:30

什么是多态性?它的用途是什么?


#1楼

通常,这指的是类型A的对象的行为类似于类型B的对象的能力。在面向对象的编程中,这通常是通过继承来实现的。 一些维基百科链接以了解更多信息:

编辑:修复断开的链接。


#2楼

多态是一种将对象类视为父类的能力。

例如,假设有一个叫Animal的类,还有一个叫Dog的类,它是从Animal继承的。 多态是将任何Dog对象都视为Animal对象的能力,如下所示:

Dog* dog = new Dog;
Animal* animal = dog;

#3楼

让我们用一个比喻。 对于给定的音乐剧本,每位演奏该曲的音乐家都会在演绎中赋予自己的风格。

音乐家可以通过界面进行抽象,音乐家所属的流派可以是一个抽象类,它定义了一些全球性的解释规则,并且每个演奏者都可以通过一个具体的类来建模。

如果您是音乐作品的听众,那么您可以参考剧本,例如巴赫(Bach)的“富加和托卡塔(Fuga and Tocata)”,每个演奏该剧本的音乐家都以自己的方式进行多态操作。

这只是一个可能的设计示例(使用Java):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}

#4楼

在面向对象的语言中,多态性允许通过同一接口处理和处理不同的数据类型。 例如,考虑C ++中的继承:类B派生自类A。类型A *的指针(类A的指针)可用于处理类A的对象和类B的对象。


#5楼

如果您考虑该术语的希腊语根源,应该会很明显。

  • 聚=许多:多边形=多面,聚苯乙烯=许多苯乙烯(a) ,多色=许多语言,依此类推。
  • 形态=变化或形式:形态=对生物形式的研究,Morpheus =能够采取任何形式的希腊梦之神。

因此,多态性是(在编程中)针对不同底层形式(数据类型)呈现相同接口的能力。

例如,在许多语言中,整数和浮点数都是隐式多态的,因为您可以加,减,乘等等,而与类型不同的事实无关。 通常,它们很少被视为对象。

但是,以同样的方式,即使BigDecimalRationalImaginary类的类也可以提供这些操作,即使它们对不同的数据类型进行操作也是如此。

经典示例是Shape类以及可以从中继承的所有类(正方形,圆形,十二面体,不规则多边形,splat等)。

使用多态性,这些类中的每一个将具有不同的基础数据。 点形状仅需要两个坐标(假设它在二维空间中)。 圆需要一个中心和半径。 正方形或矩形需要两个坐标作为左上角和右下角以及(可能)旋转的坐标。 不规则多边形需要一系列线。

通过使类负责其代码及其数据,可以实现多态。 在此示例中,每个类都有其自己的Draw()函数,并且客户端代码可以简单地执行以下操作:

shape.Draw()

以获得任何形状的正确行为。

这与旧的工作方式相反,在旧的工作方式中,代码与数据是分开的,您将拥有诸如drawSquare()drawCircle()

面向对象,多态性和继承都是紧密相关的概念,了解它们至关重要。 在我漫长的职业生涯中,有很多“银子弹”基本上都被淘汰了,但是面向对象范例已经证明是一个不错的选择。 学习,理解,喜欢它-您会很高兴的:-)


(a)我最初是作为一个玩笑而写的,但事实证明这是正确的,因此并不那么有趣。 单体苯乙烯恰好由碳和氢C 8 H 8制成,而聚苯乙烯则由(C 8 H 8 ) n基团制成。

也许我应该说息肉是字母p多次出现,尽管现在我不得不解释这个笑话,即使那似乎也不是很有趣。

有时,您应该在落后的时候退出:-)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!