什么是多态,它是什么,以及它是如何使用的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是多态,它是什么,以及它是如何使用的?相关的知识,希望对你有一定的参考价值。

什么是多态,它是什么,以及它是如何使用的?

答案

如果你考虑这个术语的希腊词根,它应该变得明显。

  • Poly = many:polygon = many-sided,polystyrene = many styrenes(a),polyglot = many languages,依此类推。
  • 形态=变化或形式:形态=研究生物形态,Morpheus =希腊梦之神能够采取任何形式。

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

例如,在许多语言中,整数和浮点数是隐式多态的,因为您可以添加,减去,乘法等,而不管类型是否不同。它们很少被视为通常术语中的对象。

但是,同样地,像BigDecimalRationalImaginary这样的类也可以提供这些操作,即使它们在不同的数据类型上运行。

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

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

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

shape.Draw()

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

这与代码与数据分离的旧方法形成对比,并且您将拥有诸如drawSquare()drawCircle()之类的函数。

面向对象,多态和继承都是密切相关的概念,它们对于了解至关重要。在我漫长的职业生涯中,有很多“银子弹”基本上刚刚失败,但OO范例已经证明是一个很好的。学习它,理解它,喜欢它 - 你会很高兴你做到了:-)


(a)我最初把它写成一个笑话,但事实证明它是正确的,因此,并不那么有趣。 momomer苯乙烯恰好由碳和氢,C8H8制成,而聚苯乙烯由(C8H8)n组成。

也许我应该说,息肉是p字母的多次出现,尽管现在我不得不解释这个笑话,即使这看起来也不好笑。

有时,你应该在你落后时退出:-)

另一答案

我知道这是一个较老的问题,有很多好的答案,但我想包括一句话答案:

处理派生类型,就好像它是基类型一样。

上面有很多例子说明了这一点,但我觉得这是一个很简洁的答案。

另一答案

(我正在浏览关于完全不同的东西的另一篇文章......并且多态性突然出现......现在我以为我知道多态性是什么......但显然不是以这种美妙的方式解释的......想要把它写在某处......更好还是会分享...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

请阅读本部分:

.....多态性。这是一种令人讨厌的说法,即不同的名词可以使用相同的动词。

另一答案

术语多态性来自:

poly =很多

态射=改变的能力

在编程中,多态是一种“技术”,它让你“看”一个对象是多种类型的东西。例如:

学生对象也是人物对象。如果您向学生“看”(即演员),您可能会要求提供学生证。你不能总是和一个人这样做,对吗? (一个人不一定是学生,因此可能没有学生证)。但是,一个人可能有一个名字。学生也这样做。

底线,从不同的“角度”“看”同一个对象可以给你不同的“视角”(即不同的属性或方法)

所以这种技术可以让你构建可以从不同角度“看”的东西。

为什么我们使用多态?对于初学者......抽象。在这一点上它应该是足够的信息:)

另一答案

一般来说,它是使用相同或表面上类似的API来连接许多不同类型的对象的能力。有各种形式:

  • 函数重载:定义具有相同名称和不同参数类型的多个函数,例如sqrt(float),sqrt(double)和sqrt(complex)。在大多数允许这种情况的语言中,编译器会自动为传递给它的参数类型选择正确的语言,因此这是编译时多态。
  • OOP中的虚方法:类的方法可以根据其子类的细节定制各种实现;据说这些中的每一个都覆盖了基类中给出的实现。给定一个可能是基类或其任何子类的对象,动态选择正确的实现,因此这是运行时多态。
  • 模板:某些OO语言的一个特性,其中函数,类等可以通过类型进行参数化。例如,您可以定义一个通用的“列表”模板类,然后将其实例化为“整数列表”,“字符串列表”,甚至可能是“字符串列表列表”等。通常,您为任意元素类型的数据结构编写一次代码,编译器为各种元素类型生成它的版本。
另一答案

让我们用一个类比。对于给定的音乐剧,每个演奏它的音乐家都会在演绎中给出自己的触觉。

音乐家可以用界面抽象,音乐家所属的类型可以是抽象类,它定义了一些全局解释规则,每个演奏的音乐家都可以用具体的类建模。

如果您是音乐作品的倾听者,您可以参考该剧本,例如:巴赫的“Fuga and Toccata”以及所有表演它的音乐家都以自己的方式多态化。

这只是一个可能的设计示例(在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());
}
另一答案

我已经为另一个问题提供了多态性的高级概述:

Polymorphism in c++

希望能帮助到你。提取物......

...它有助于从简单的测试开始和[多态性]的定义。考虑一下代码:

Type1 x;
Type2 y;

f(x);
f(y);

在这里,f()将执行一些操作,并被赋予值xy作为输入。为了具有多态性,f()必须能够使用至少两种不同类型(例如intdouble)的值进行操作,找到并执行适合类型的代码。

(继续在Polymorphism in c++

另一答案

多态性是一种物体的能力,可以采取多种形式。例如,在人类中,当我们谈论关系时,人可以以多种形式行事。 EX:一个男人是他儿子的父亲,他是他妻子的丈夫,他是他的学生的老师。

另一答案

多态性是一种物体采取多种形式的能力。当父类引用用于引用子类对象时,OOP中最常见的多态性使用发生。在这个用Java编写的示例中,我们有三种类型的工具。我们创建三个不同的对象并尝试运行他们的轮子方法:

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

结果是:

The Result

欲了解更多信息,请访问https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java。我希望它有所帮助。

另一答案

多态性是程序员根据这些对象的需要编写同名方法的能力,这些方法针对不同类型的对象执行不同的操作。例如,如果您正在开发一个名为Fraction的类和一个名为ComplexNumber的类,则这两个类都可能包含一个名为display()的方法,但每个方法都会以不同方式实现该方法。例如,在php中,您可以像这样实现它:

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "
";

echo 'This is a complex number: '
$complex->display();
echo "
";

输出:

This is a fraction: 1/2
This is a complex number: 1 + 2i

其他一些答案似乎暗示多态性仅与继承结合使用;例如,也许FractionComplexNumber都实现了一个名为Number的抽象类,它有一个方法display(),然后Fraction和ComplexNumber都有义务实现。但是你不需要继承来利用多态性。

至少在PHP这样的动态类型语言中(我不了解C ++或Java),多态性允许开发人员在不必提前知道对象类型的情况下调用方法,并相信方法的正确实现将会叫做。例如,假设用户选择创建的Number类型:

$userNumber

以上是关于什么是多态,它是什么,以及它是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 [cmdletbinding()] 以及它是如何工作的?

SignInManager,它是啥以及如何使用,何时使用?

学习大数据:Java基础篇之多态

学习大数据:Java基础篇之多态

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

Hashgraph,它是啥以及它是如何工作的?