分類
數字趨勢

如何通过继承组织面向对象的代码

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

但是类本身呢?有时,类也非常相似。例如,一棵树有树枝,根和树干。这适用于榆树,橡树和美国黄松。

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

为什么继承很重要?

面向对象的编程中有一个概念称为“保持干燥”。 DRY代表“不要重复自己”。如果您发现自己复制并粘贴了大量代码,那么还会引入很多错误的余地。

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

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

然后您的老板告诉您,高层管理人员取得了巨大突破。他们意识到它已经不再是90年代了,他们可以在Tamagotchi中容纳超过5K的内存。现在他们想要所有的熊。

您卷起袖子重新开始工作,创建了Bear类的副本。然后老板再次敲门。事实证明,他们希望游戏更具教育意义。现在,您必须向每个宠物添加起源信息。

您不再需要复制代码。现在,您正在为所有八种熊更改数百行代码。这是错误发生的方式,并且引入了错误。

当您磨砺时,您的老板又走了。现在,高层管理人员也希望游戏中所有啮齿动物。哦,还有一只长颈鹿。

您知道完成后,他们会想要猴子或其他东西。肯定有更好的办法。

除了创建下一代Tamogatchi,您还可以始终使用现有的Tamogatchi。

营救的传承

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

黑熊,灰熊和懒惰熊都是熊。熊,啮齿动物和猴子都是动物。这就是我们构造家谱的方式。

这是部分代码的样子:

 class Animal {
private _weight: number;
private _origin: string;
constructor(weight: number = 0, origin: string = "") {
this._weight = weight;
this._origin = origin;
}
makeNoise(noise: string = "") {
console.log("made a noise that sounded like: " + noise);
}
eat(food: string = "") {
console.log("eats " + food);
}
sleep() {
console.log("got a good night's sleep");
}
roam() {
console.log("wandered about aimlessly");
}
}
class Bear extends Animal {
constructor(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 {
constructor(weight: number = 600, origin: string = "North America") {
super(weight, origin);
}
}
class Panda extends Bear {
constructor(weight: number = 230, origin: string = "China") {
super(weight, origin);
}
makeNoise() {
super.makeNoise("squeek");
}
eat() {
super.eat("shoots and leaves");
}
}

您可以在TypeScript沙箱中使用代码

那是一个很大的示例,但是代码很简单,并且所有类都来自Animal类。您可以看到Bear扩展了Animal 。而GrizzlyBearPanda扩展了Bear类。 Bear类创建默认的声音进餐功能。 GrizzlyBear类使用这些默认功能,而Panda不使用。

换句话说, GrizzlyBear类不会覆盖Bear函数。由于GrizzlyBear扩展了Bear ,它将自动使用Bear定义的功能。但是,由于Panda覆盖了makeNoiseeat函数,它将使用它们代替。

用“是,有”技术寻找关系

要弄清楚一个类是否真的应该扩展另一个类,您可以问问自己,它们之间是否存在“是”或“具有”关系。

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

这个例子有点简单,但是当处理现实世界的类时,它会很有帮助。

动手继承实践和理解

准备应用您所学到的知识了吗?

  • 访问沙箱并填写上面示例中的其余动物类。
  • 添加一个猴子类。
  • 添加一个ProboscisMonkey类,以扩展您的猴子类。

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