注意: 如果您是 TypeScript 新手,请先查看我们的 TypeScript 入门 教程。
在 TypeScript 中,抽象类是不能直接实例化的类——你无法从中创建对象。我们使用 abstract
关键字来声明一个抽象类。例如,
// Create an abstract class
abstract class Shape {
// Class content here
}
您不能直接创建 Shape
类的实例
// Error: Cannot create an instance of an abstract class
const a = new Shape();
注意:抽象类旨在被其他类扩展,这些类提供了对其抽象方法的实现。
抽象类可以同时包含抽象方法和常规方法(带有实现的普通函数)。例如,
abstract class Shape {
// Abstract method
abstract calculateArea(): void;
// Regular method
getDimensions(): void {
console.log("The dimension is ");
}
}
要了解常规方法,请访问 TypeScript 函数。在这里,我们将学习抽象方法。
抽象方法
抽象方法是在抽象类中声明但没有主体的方法。它以分号 (;)
结尾,并且必须由任何子类实现。
我们使用相同的 abstract
关键字来创建抽象方法。例如,
abstract class Shape {
abstract calculateArea(): void;
}
这里,
calculateArea()
是一个抽象方法。calculateArea()
的主体被分号;
替换了。
如果一个类包含至少一个抽象方法,那么该类就应该被声明为抽象类。否则,它将产生一个错误。例如,
// Error
// Class should be abstract
class Shape {
abstract method1(): void;
}
注意:扩展抽象类的类称为子类(或派生类)。它继承所有非抽象代码,并且必须实现所有抽象方法。
示例 1:抽象类和方法
// Abstract class
abstract class Shape {
protected dimension: number;
constructor(dimension: number) {
this.dimension = dimension;
}
// Abstract method
abstract calculateArea(): number;
}
// 'Square' is a subclass that inherits from 'Shape'
class Square extends Shape {
calculateArea(): number {
return this.dimension * this.dimension;
}
}
const square = new Square(5);
console.log("Area of square:", square.calculateArea());
输出
Area of square: 25
在上面的示例中,我们创建了一个名为 Shape
的抽象类,其中包含一个抽象方法 calculateArea()
。
Square
类扩展了 Shape
,并提供了 calculateArea()
方法的具体实现。
然后,我们创建了 Square
类的一个实例,并使用该实例调用了 calculateArea()
方法。
square.calculateArea();
此方法返回正方形的面积,然后使用以下方式将其记录到控制台:
console.log("Area of square:", square.calculateArea());
示例 2:具有多个子类的抽象类
// Abstract class
abstract class Animal {
abstract Sound(): void;
}
// Sub class
class Dog extends Animal {
Sound(): void {
console.log("Woof! Woof!");
}
}
// Sub class
class Cat extends Animal {
Sound(): void {
console.log("Meow!");
}
}
const dog = new Dog();
dog.Sound();
const cat = new Cat();
cat.Sound();
输出
Woof! Woof! Meow!
在这里,Dog
和 Cat
都扩展了抽象类 Animal
并实现了 Sound()
方法。
我们创建它们的实例并调用该方法以产生不同的输出。
为什么使用抽象类?
我们出于以下原因在 TypeScript 中使用抽象类:
- 为相关类定义通用结构。
- 确保所有子类都实现特定的方法。
- 为所有子类编写共享代码,同时允许它们定义自己的特定部分。
阅读更多