抽象类 – 总结
What are Abstract Classes in Typescript
打字稿中的抽象类:
- 不能用于直接创建对象——不能使用
new
关键字直接实例化抽象类 - 只能作为父类
- 可以包含方法和属性的实际实现,其中实现的方法可以引用抽象属性/方法
- 可以让子类承诺实现在父类上定义的抽象方法/属性
抽象类与接口
- 当抽象类被编译为 javascript 时,与接口相反,它们并没有被完全删除。这意味着我们可以
instanceof
对类而不是接口使用检查。 - 抽象类也可以有实现的方法,而接口只有应该实现方法的蓝图。
抽象类示例
让我们看一个简单的例子:
abstract class Animal { // no implementation - just the signature abstract type: string; abstract move(): void; // has implementation; breathe() { console.log(`The ${this.type} takes a breath.`); } } // Not permitted to create an instance of an abstract class // const animal = new Animal() class Dog extends Animal { type = 'dog'; move() { console.log('The dog runs.'); } } class Monkey extends Animal { type = 'monkey'; move() { console.log('The monkey jumps.'); } } const dog = new Dog(); // can use the implemented method from the abstract class dog.breathe(); // or the methods for which the child class provides implementation dog.move(); const monkey = new Monkey(); monkey.breathe(); monkey.move();
当我们扩展一个抽象类时,我们被迫为
abstract
方法或属性提供实现,换句话说,要符合抽象类强制执行的签名。
我们还可以使用抽象类方法实现的方法,就像继承正常工作的方式一样,任何扩展 animal 的类都可以访问breathe
继承中定义的方法。请注意,在
breathe
我们使用抽象属性的方法中,在抽象类的实现方法中,我们可以使用任何abstract
属性或方法,因为我们保证子类必须实现它们。
我们可以将抽象属性/方法视为 – 存在于未来,或者换句话说,由某个子类实现。
何时使用抽象类
当我们abstract classes
想要提供某些功能的可重用实现时使用,但该功能可能依赖于我们还无法实现的其他一些功能,因为它们是非常特定于扩展抽象类的不同子类的功能。
例如,我们可以想象该move
方法的实现在扩展该类的不同子类之间可能会有很大不同abstract
。然而,在未来的某个时间点,所有的子类都会有一个move
符合类中指定类型的方法
版本abstract
。