如何用继承来组织面向对象的代码

正确使用面向对象编程意味着您需要了解继承以及它如何简化编码和减少错误。...

在面向对象编程中重用代码是很常见的。类的存在使您可以创建对象,而不必反复编写相同的变量和函数。

a family of Japanese macaque bathing in a hot spring

但是班级本身呢?有时课程也很相似。例如,一棵树有树枝、根和树干。这适用于榆树、橡树和黄松。

如果你在游戏中添加一棵树,你可以为几十棵树创建树的部分。但是创建一个树类并让其他树继承其属性会更容易。

为什么继承很重要?

在面向对象编程中有一个概念叫做“保持干燥”。DRY的意思是“不要重复自己”。如果你发现自己复制和粘贴了大量代码,你也会给很多错误带来空间。

假设您正在为一个新的Tamagotchi游戏编写代码。第一个虚拟宠物将是北极熊。所以在JavaScript/TypeScript中创建了一个名为PolarBear的类。

class PolarBear { private _weight: number = 990; c***tructor(weight: number = 0) { this._weight = weight } makeNoise() { c***ole.log("made a roar"); } eat() { c***ole.log("eats whatever it wants"); } sleep() { c***ole.log("got a good night's sleep"); } roam() { c***ole.log("wandered about aimlessly"); }}

然后你的老板告诉你高层管理有了巨大的突破。他们意识到现在已经不是90年代了,他们可以在Tamagotchi中容纳5千个以上的内存。现在他们想要所有的熊。

你卷起袖子回去工作,创造熊类的副本。然后你的老板又来敲你的门。结果他们希望游戏更具教育性。现在你必须为每只宠物添加原产地信息。

你不再复制代码了。现在你要为所有八种熊更改数百行代码。错误就是这样发生的,错误就是这样被引入的。

当你磨磨蹭蹭的时候,你的老板又来了。现在上级管理层也希望所有的啮齿动物都参与进来。哦,还有一只长颈鹿。

你知道当你做了,他们会想要猴子或其他东西。一定有更好的办法。

与其创造下一代Tamogatchi,你可以一直玩现有的。

继承来拯救

a polar bear that looks like it's **iling and waving at the camera

为了驯服你的虚拟动物园,你需要组织起来。继承通过向类添加父关系和子关系来帮助您安排类。

黑熊、灰熊和懒熊都是熊。熊、啮齿动物和猴子都是动物。这就是我们构建家谱的方法。

a diagram showing the tree like relati***hips of inherited classes

代码的一部分是这样的:

class Animal { private _weight: number; private _origin: string; c***tructor(weight: number = 0, origin: string = "") { this._weight = weight; this._origin = origin; } makeNoise(noise: string = "") { c***ole.log("made a noise that sounded like: " + noise); } eat(food: string = "") { c***ole.log("eats " + food); } sleep() { c***ole.log("got a good night's sleep"); } roam() { c***ole.log("wandered about aimlessly"); }}class Bear extends Animal { c***tructor(weight: number, origin: string) { super(weight, origin); } makeNoise(noise: string = "roar") { super.makeNoise(noise); } eat(food: string = "whatever it wants") { super.eat(food); }}class GrizzlyBear extends Bear { c***tructor(weight: number = 600, origin: string = "North America") { super(weight, origin); }}class Panda extends Bear { c***tructor(weight: number = 230, origin: string = "China") { super(weight, origin); } makeNoise() { super.makeNoise("squeek"); } eat() { super.eat("shoots and leaves"); }}

您可以在TypeScript沙盒中玩代码。

这是一个很大的示例,但是代码非常简单,所有类都是Animal类的后代。你可以看到那只熊和那只动物。灰熊和熊猫扩大了熊的种类。Bear类创建默认的sound和eat函数。GrizzlyBear类使用这些默认函数,但Panda没有。

换句话说,GrizzlyBear类不会重写Bear函数。由于GrizzlyBear扩展了Bear,它将自动使用Bear定义的函数。但由于Panda重写了makeNoise和eat函数,因此它将使用这些函数。

用“is-a,has-a”技巧寻找关系

为了弄清楚一个类是否真的应该扩展另一个类,您可以问问自己它们之间是否存在“is-a”或“has-a”关系。

  • 狐猴是猴子。
  • 袋鼠是有袋动物。
  • 不过,兔子的脚不是兔子。兔子有一只脚。

这个例子有点简单,但是在处理实际类时,它会非常有用。

实践与理解

a proboscis monkey looking thoughtful

准备好应用你所学的了吗?

  • 访问沙盒并填写上面示例中的其他动物类。
  • 添加猴子类。
  • 添加扩展monkey类的ProboscisMonkey类。

继承不仅仅是组织良好的代码。它是面向对象编程的核心部分。继承有助于简化对象之间的通信。它允许更高级的面向对象设计,比如多态性。您可以从TypeScript文档中了解有关继承的更多信息。

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

你可能感兴趣的文章

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

关键区别——oop中的多态与继承 面向对象程序设计(OOP)是软件开发中常用的方法。许多编程语言支持面向对象编程。面向对象编程是一种使用类和对象设计程序的方法。OOP中的类是创建对象的蓝图。类具有属性和方法。对...

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

继承(inheritance)和java接口(interface in java)的区别

继承(inheritance)和java接口(interface in java)的区别 Java是Sun Microsystems公司开发的一种编程语言。Java可以用来开发各种应用程序。它是一种支持面向对象、结构化等多种范式的语言,Java的主要优点是支持面向对象编程(OOP)。程序...

  • 发布于 2020-10-25 00:02
  • 阅读 ( 491 )

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

... 面向对象编程:继承 ...

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

python面向对象编程初学者指南

... 理解python中的继承 ...

  • 发布于 2021-03-24 14:43
  • 阅读 ( 210 )

建造师(constructor)和方法(method)的区别

...容之前声明,尽管方法可以是空的。 构造函数和方法的继承 构造函数不是子类继承的,因为它们不是类的成员。但是,可以从子类调用超类(父类)的构造函数。另一方面,方法由子类继承以提供代码的可重用性。 构造函数和...

  • 发布于 2021-06-25 08:37
  • 阅读 ( 431 )

作文(composition)和继承(inheritance)的区别

...在面向对象编程中,有两种基本的方法来建立这些关系:继承和组合。实现继承是关联类的一种方法,但是OOP提供了一种新的类之间的关系,称为组合。通过在新类和现有类之间建立关系,新类可以从一个或多个现有类继承或嵌...

  • 发布于 2021-06-26 02:18
  • 阅读 ( 233 )

哦(oop)和流行音乐(pop)的区别

...3.OOP和POP的区别–主要区别比较 关键术语 抽象、封装、继承、OOP、POP、多态性、编程范式 什么是哦(oop)? OOP(面向对象编程)允许程序员使用对象来建模真实世界的场景。对象是具有状态和行为的任何实体。它是一个类的实例...

  • 发布于 2021-07-01 00:03
  • 阅读 ( 305 )

关系数据库(rdbms)和面向对象数据库管理系统(oodbms)的区别

...管理系统。程序员可以在OODBMS中使用面向对象的概念,如继承、多态、封装和数据库功能,如原子性、一致性、隔离性和持久性。这些数据库提供了诸如系统可扩展性、代码可重用性和可维护性等优点。 Figure 2: OOP Objects OODBMS与...

  • 发布于 2021-07-01 02:22
  • 阅读 ( 654 )

C++(c++)和JAVA(java)的区别

...中使用它们。 此外,可以实现面向对象的编程概念,如继承、抽象、封装和多态性以及结构化编程概念,如选择(IF,EASE),重复结构(用于、做、而等)C++等。此外,这种语言允许动态内存分配。程序员可以通过调用free()...

  • 发布于 2021-07-01 07:51
  • 阅读 ( 332 )

C(c)和C++(c++)的区别

...我们可以使用C++实现面向对象编程概念,如封装、多态、继承等。它还提供了一个称为标准模板库(STL)的库。因此,程序员可以在程序中使用该库中可用的函数。 C++是一种基于编译器的语言。编译器将整个源代码转换为机器...

  • 发布于 2021-07-01 12:20
  • 阅读 ( 231 )
Atlannovel
Atlannovel

0 篇文章

相关推荐