什么是多态性?为什么值得学习

多态性是程序员武器库中一个强大的工具。下面是它的工作原理和使用方法。...

如果你能开4门通勤车,你也可以开皮卡。如果你开的是内燃机车,你也可以开电动车。

a birds eye view of a collection of swimming pools

乘用车的形状和大小各不相同。运行这些车辆的发动机也可能完全不同。但这对司机来说并不重要。

你只要上车,系好安全带,启动汽车,挂上挡,然后开车。这是因为汽车、卡车和面包车都是多态的。

多态性:分解

让我们看看多态这个词。你可以把它分解成多边形,变形和变形。

多边形意味着很多,就像多边形意味着很多角度。当用作名词时,变体是一个物种的变体。i**可以指系统。

所以多态性仅仅意味着一个由许多变体组成的系统。不过,这仍然不能告诉你它是如何在编程中使用的。那是下一个。

如果它像鸭子一样走路。。。为什么多态对象很棒

a collection of baby ducks

在代码中创建从另一个类继承的类时,就是将新类绑定到协定。合同规定父级中的每个变量和函数也将在子级中。

每辆车都有方向盘、油门、刹车踏板和转向灯。开车不需要打开引擎盖。重要的是它是一辆车。

这同样适用于从其他类继承的类。下面是TypeScript中的一个示例:

class Vehicle { private _engine: string; private _tires: number; c***tructor(engine: string = "combustion", tires: number = 4) { this._engine = engine; this._tires = tires; } accelerate(velocity: number) { c***ole.log("accelerating at a velocity of " + velocity); } brake(pressure: number) { c***ole.log("applying " + pressure + " pressure"); } turnLeft() { c***ole.log("turning left"); } turnRight() { c***ole.log("turning right"); }}class Car extends Vehicle {}class Tesla extends Car { c***tructor() { super("electric"); }}

在本例中,有一个Vehicle类。Car类继承自Vehicle类。特斯拉继承了汽车。现在让我们创建两个对象并查看它们。

let myCoupe: Car = new Vehicle();c***ole.log(myCoupe);c***ole.log(myCoupe.c***tructor.name);let mySedan: Vehicle = new Tesla(); c***ole.log(mySedan);c***ole.log(mySedan.c***tructor.name);myCoupe.turnLeft();mySedan.turnLeft();

你可以看到,我们宣布myCoupe是一辆汽车,mySedan是一辆汽车。然后我们将myCoupe实例化为一个新的载体,mySedan实例化为一个新的Tesla。如果您访问TypeScript沙盒并运行代码,您将看到它可以正常工作。根据合同,它的行为和你预期的一样。

换句话说,所有车辆都可以左转,因为它们从车辆类继承了左转。编辑者知道每一辆车的孩子都同意这个合同。所以它假设一切正常,不管对象被类型化或实例化为什么类。

这有时被称为“duck typing”,编译器假设如果它像鸭子一样走路,像鸭子一样说话,那么它也可能是鸭子。因此编译器不必担心细节,只需像鸭子一样对待对象。

多态性使您的代码防弹

多态契约的另一个优点是可以保证代码正常工作。如果您已经强类型化了所有变量以及每个函数返回的内容,那么您就知道每个子级都将始终匹配变量、函数和类型。

这意味着您可以在不破坏程序的情况下添加和更改类中的代码。每一个引用车辆对象的对象都会得到满足期望的数据和功能,无论车辆发生了多少变化。

函数中的代码可能无法输出正确的结果。但这是另一种问题。只要函数遵循约定并返回预期类型的变量,就不会导致代码中断错误。

多态性是巨大的,这里还有10条编程原则你应该知道。

练习多态性

a bird's eye view of a jetski making a U-turn in very blue water

  • 使用上面的沙盒链接创建一个Boat类。
  • 实例化一个新的boat对象,使其成为一个Vehicle类型,但仍然看起来像一个boat。
  • 确保船仍像车辆一样运行。

多态性的最后一个例子

多态性是一个很难掌握的概念。但是一旦你得到了它,你就在理解面向对象编程的真正意义上迈出了一大步。不过,这个概念似乎仍然是理论上的。所以这里有一个真实的例子来帮助你看到它有多有用。

假设您正在构建一个连接到MySQL数据库的web应用程序。然后老板决定切换到PostgreSQL数据库。这是否意味着您必须重写所有数据库调用?

不,不是这样的。如果你的应用程序使用一个DataAccess类,而它的子类实际上在数据中乱放,那么你就很幸运了。DataAccess类定义应用程序如何与数据交互,而不是如何与数据库交互。

有MySQLAccess和postgresqlcaccess这样的子类来完成所有的脏活。但是,如果你的应用程序只有DataAccess对象,你可以交换数据库而不需要重写一行应用程序代码。

  • 发表于 2021-03-30 04:32
  • 阅读 ( 248 )
  • 分类:编程

你可能感兴趣的文章

瞬变(transient)和平衡多态性(balanced polymorphism)的区别

瞬时多态性和平衡多态性的关键区别在于等位基因的行为。瞬时多态性是指一个基因的一个等位基因被另一个等位基因进行替换,而平衡多态性是指一个基因的两个不同等位基因随着时间的推移而保持不变 遗传多态性是一个...

  • 发布于 2020-09-21 23:59
  • 阅读 ( 435 )

母亲(maternal)和父系dna检测(paternal dna testing)的区别

...子技术是DNA指纹、短串联重复序列分析和限制性片段长度多态性(RFLP)。 目录 1. 概述和主要区别 2. 什么是母体DNA检测 3. 什么是父系DNA检测 4. 父母DNA检测的相似性 5. 并列比较-母亲和父亲的DNA测试表格形式 6. 摘要 什么是母体dn...

  • 发布于 2020-10-17 05:12
  • 阅读 ( 340 )

早期的(early)和后期装订(late binding)的区别

...区别——早期绑定与后期绑定 早期绑定和后期绑定是与多态性相关的两个概念。早期绑定发生在编译时,后期绑定发生在运行时。早期绑定和后期绑定的关键区别在于早期绑定使用类信息来解析方法调用,而后期绑定使用对象...

  • 发布于 2020-10-19 04:05
  • 阅读 ( 381 )

多态性(polymorphism)和oop中的继承(inheritance in oop)的区别

...封装四大支柱。本文讨论了OOP中多态与继承的区别。OOP中多态性与继承的关键区别在于多态性是一个对象以多种方式表现的能力,而继承则是使用现有类的属性和方法创建一个新的类。 目录 1. 概述和主要区别 2. 什么是OOP中的多...

  • 发布于 2020-10-19 21:16
  • 阅读 ( 552 )

多态性(polymorphism)和同素异形(allotropy)的区别

多态性与同素异形体的主要区别在于,多晶性发生在化合物中,而同素异形体则发生在化学元素中。 多态性是指同一固体物质存在几种不同形式。这意味着这类化合物可能有不止一种晶体结构。另一方面,同素异形是一个类...

  • 发布于 2020-10-22 11:39
  • 阅读 ( 668 )

同构(isomorphism)和多态性(polymorphism)的区别

同构(isomorphi**)和多态性(polymorphi**)的区别 化合物在自然界中可以以不同的形式存在。这些不同的形态可以是不同的形态或结构。化合物的结构决定了该化合物的物理性质。有时化学性质也由结构决定。“形态”是一个用来命...

  • 发布于 2020-10-24 01:53
  • 阅读 ( 401 )

什么是面向对象编程?用外行术语解释的基础知识

... 面向对象编程:多态性 ...

  • 发布于 2021-03-24 11:07
  • 阅读 ( 213 )

一个视频:由椅子电梯多态

...列节目。每周我们都会告诉你“一个视频”,你需要看,为什么,看多长时间。 欢迎观看一个视频。你会注意到这周只有我(凯特琳),因为莉齐不在办公室做牙科手术,我不会详细说明,因为这不关你的事。你真正需要知道...

  • 发布于 2021-05-10 15:22
  • 阅读 ( 86 )

基因型(genotype)和表型(phenotype)的区别

...的,这取决于它们表现出的表型。等位基因是由单核苷酸多态性(SNP)变异产生的基因。 Figure 1: Genotypes of Mendel flowers 三种基因型BB、BB和BB决定了豌豆植株的花的颜色,如图1所示。花的颜色的显性表型是紫色;白色为隐性表型...

  • 发布于 2021-06-28 13:07
  • 阅读 ( 828 )

突变(mutation)和多态性(polymorphism)的区别

主要差异突变(main difference mutation) vs. 多态性(polymorphi**) 突变和多态性是用来描述DNA变异的两个术语。DNA变异可能是由于DNA复制错误或外部因素(如紫外线和化学物质)造成的。突变是指特定个体的DNA变异,而多态性是指...

  • 发布于 2021-06-29 09:54
  • 阅读 ( 323 )
sw87703
sw87703

0 篇文章

相关推荐