这是关于如何使用面向对象技术在TypeScript中编程的4部分文章的第2部分。如果您刚刚开始使用TypeScript和WebStorm,请参阅我们关于TypeScript入门的博客文章。
在TypeScript中实现抽象
抽象是对系统中的对象建模的一种方法,该系统在类或类型与继承它的代码之间创建职责分离。正如您将在本文中看到的那样,它也是一种强制执行基于合同的开发概念的方法。开发人员创建一个类型,即类或接口,该类型指定调用代码应该实现的内容,而不是如何实现。因此,定义需要做什么是抽象类型的工作,但实际做这些事情取决于消费类型。从抽象类和接口继承或实现抽象。
例如,一些银行账户是收费的。您可以创建一个定义收费方法的收费接口 。由于不同类型的帐户费用是不一样的,并不能完全适用,所以最好创建一个可以应用于继承层次结构中任何位置的特定类的接口。支票账户可能会收取费用,而它的父母和兄弟,普通银行账户和储蓄账户可能不会。
interface Fee {
chargeFee(amount: number );
}
// parent BankAccount and sibling SavingsAccount do not implement Fee interface
class BankAccount { ... }
class SavingsAccount extends BankAccount { ... }
// checking implements Fee
class CheckingAccount extends BankAccount implements Fee {
chargeFee(amount: number) {}
}
子类继承在父类中实现的接口成员,因此如果BusinessChecking帐户继承了CheckingAccount类,那么它将继承该实现。
// BusinessChecking inherits CheckingAccount and therefore Fee
class BusinessChecking extends CheckingAccount { … }
// Code that uses BusinessChecking can call chargeFee
function CalculateMonthlyStatements() {
let businessChecking = new BusinessChecking();
businessChecking.chargeFee(100);
}
如果您实现了一个接口,但还没有实现所有成员,WebStorm会通知您,并提供一个快速修复(Alt-Enter),将方法签名插入到类中。从那里,您可以像往常一样填写实现代码。
image
因为抽象意味着分离可能具有模糊边界的职责,有时候,您会发现您在类层次结构的错误级别添加了一个成员。也许您已经创建了一个更适合放在父类中的成员,以便让子类继承。在我们的银行业务场景中,这可能是应用于储蓄账户的最小余额,尽管最小余额适用于所有类型的银行账户 - 不仅仅是储蓄。不用担心,WebStorm包含了一个功能,可以把成员拉上来,这样你就可以设计更好的抽象类了。使用您可以在Refactor菜单中找到的Pull Members Up重构,或者在Refactor this ...(Windows上的Ctrl + Alt + Shift + T或Mac上的Ctrl-T)弹出窗口中找到。
oop-pull-members-up.gif
总结
在本文中,我们讨论了什么是抽象,以及如何通过使用WebStorm的抽象类和接口在TypeScript中实现抽象。
网友评论