分類
數字趨勢

面向对象编程中的抽象入门指南

当您吃墨西哥卷饼时,您的每个味觉感受器都会欢乐地唱歌。每口食物都会带来不同风味的组合,例如咸,甜,辣和鲜味。之后的每一口小吃都会略有不同,因为新的成分集合将它们的味道融合在一起。

您可能已经从菜单中阅读了成分,但是您不完全知道莎莎酱的制作方法。他们在蔬菜上使用的调味料可能是秘密混合。不过,您不需要知道所有确切的成分。知道它很美味就足够了。

您知道的成分,例如普通的白米饭,都是混凝土。其他元素是抽象的。你知道这是莎莎酱,但是什么样的呢?或者,如果有人只是无所事事地给您一个墨西哥卷饼,那么整个墨西哥卷饼就是抽象的。

抽象中的抽象

与继承一起,抽象是面向对象编程中的重要概念。从理论上讲,每个对象都应提供简单且可预测的结果。对象也应该只共享需要共享的内容。

当适当时,抽象使代码和数据隐藏

您可以将墨西哥卷饼当作一个对象。在墨西哥卷饼中,您还有其他一些对象,例如豆类,大米,奶酪和辣酱。咖啡豆可能已经调味。奶酪可以是混合物。而且辣酱可能是用醋腌制过的辣椒混合而成的。

您不需要知道墨西哥卷饼中所有成分的制作方式。对于热狗,您可能不想知道。重要的是,它在您食用时不会分解,而且非常美味。

抽象与封装紧密相关

编程对象也是一样。当实例化一个对象(从类创建它)时,就像从食物卡车柜台订购墨西哥卷饼。您可以访问某些数据,但不是全部。只要函数返回正确的数据,您就无需知道对象的工作方式。这是JavaScript / Typescript中的墨西哥卷饼:

 class CheeseBlend {
private _ingredients = ["Colby Jack", "Cheddar", "Manchego"];
get ingredients() {
return "melted cheese";
}
}
class SecretSalsa {
private _ingredients = ["onions", "tomatoes", "cilantro", "Guatemalan Insanity Peppers"];
get ingredients() {
return "it's a secret";
}
}
class Burrito {
private _beans = "beans";
private _rice = "rice";
private _cheese: CheeseBlend = new CheeseBlend();
private _salsa: SecretSalsa = new SecretSalsa();
get cheese() {
return this._cheese.ingredients;
}
get salsa() {
return this._salsa.ingredients;
}
}
let burro = new Burrito();
console.log(burro.cheese);
console.log(burro.salsa);

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

在上面的示例中,提取了莎莎和奶酪成分。首先,将它们封装起来以隐藏特殊成分。然后添加吸气剂以获取成分。但是成分仅返回其真实含义的抽象表示。

混凝土中的抽象

但是,抽象不仅仅是一个概念。类也可以是抽象的。这意味着他们可以定义其他类。但是他们自己不能实例化。

为什么有时班级应该抽象

想象一下,您去一家餐厅坐下。服务员递给您菜单。您打开它发现只有一项:食物。

那很抽象。您要点吗?你会吃吗?您可能不会。仅仅说食物是不够的。它需要分解成更具体的东西。

那面食呢?好吧,那是一种更具体的食物。而且我们知道它可能有面条和酱汁。但是有很多不同种类的面食,所以它仍然很抽象。

什么是抽象,什么是具体?

意大利细面条阿尔弗雷多是食品和面食的具体例子。同样的事情也适用于类。并非每个类都应实例化。一些类只应定义其他类的结构。

这是一个抽象的Food类和一个MacadamiaNuts子类的示例:

 abstract class Food {
constructor(public name: String) {}
abstract totalCalories(): number;
abstract description(): string;
abstract flavor(): string;
}
class MacadamiaNuts extends Food {
constructor() {
super("One Cup of Macadamia Nuts");
}
totalCalories() {
return 962;
}
description() {
return "A nut from Hawaii.";
}
flavor() {
return "rich, buttery, and nutty";
}
}
let nuts = new MacadamiaNuts();
console.log(nuts.name)
console.log(nuts.description())

这是代码。

抽象类告诉其他类它们应该如何表现。在上面的示例中,如果您要成为食品类,则必须具有允许访问您的姓名,风味,描述和卡路里的函数。

请注意, MacadamiaNuts扩展了Food 。就是说澳洲坚果同意遵守食品规则。另外,请注意,构造函数调用super 。该命令在构造函数实例化MacadamiaNuts之前实例化父类。

如果您正在学习编程,那么可以通过这些编程游戏获得更多的乐趣

抽象实践

  • 访问上面的链接,并使用沙盒创建一个名为Soup的抽象类
  • 创建一个名为CerealSoup类的具体孩子。
  • 使用console.log测试您的代码。如果您的谷物类缺少Soup中定义的功能之一,该怎么办?

但是您不能实例化的类的重点是什么?

最初,抽象类似乎是不必要的。毕竟,您实际上不能使用它们来创建对象。而且这并不像他们放弃了职能。必须在每个子类中重写函数。

您需要抽象类有两个主要原因。他们使您的代码保持一致,并确保其他开发人员也编写一致的代码。您不会总是一个人工作。整个团队需要遵循相同的规则。您可以从有关抽象类的TypeScript文档中了解更多信息。