什么是多态,它是什么,以及它是如何使用的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是多态,它是什么,以及它是如何使用的?相关的知识,希望对你有一定的参考价值。
什么是多态,它是什么,以及它是如何使用的?
如果你考虑这个术语的希腊词根,它应该变得明显。
- Poly = many:polygon = many-sided,polystyrene = many styrenes(a),polyglot = many languages,依此类推。
- 形态=变化或形式:形态=研究生物形态,Morpheus =希腊梦之神能够采取任何形式。
因此,多态性是(在编程中)为不同的底层形式(数据类型)呈现相同的接口的能力。
例如,在许多语言中,整数和浮点数是隐式多态的,因为您可以添加,减去,乘法等,而不管类型是否不同。它们很少被视为通常术语中的对象。
但是,同样地,像BigDecimal
或Rational
或Imaginary
这样的类也可以提供这些操作,即使它们在不同的数据类型上运行。
经典的例子是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());
}
我已经为另一个问题提供了多态性的高级概述:
希望能帮助到你。提取物......
...它有助于从简单的测试开始和[多态性]的定义。考虑一下代码:
Type1 x;
Type2 y;
f(x);
f(y);
在这里,
f()
将执行一些操作,并被赋予值x
和y
作为输入。为了具有多态性,f()
必须能够使用至少两种不同类型(例如int
和double
)的值进行操作,找到并执行适合类型的代码。
(继续在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");
}
}
结果是:
欲了解更多信息,请访问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
其他一些答案似乎暗示多态性仅与继承结合使用;例如,也许Fraction
和ComplexNumber
都实现了一个名为Number
的抽象类,它有一个方法display()
,然后Fraction和ComplexNumber都有义务实现。但是你不需要继承来利用多态性。
至少在PHP这样的动态类型语言中(我不了解C ++或Java),多态性允许开发人员在不必提前知道对象类型的情况下调用方法,并相信方法的正确实现将会叫做。例如,假设用户选择创建的Number
类型:
$userNumber以上是关于什么是多态,它是什么,以及它是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章
什么是 [cmdletbinding()] 以及它是如何工作的?