TypeScript 抽象类和方法

注意: 如果您是 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!

在这里,DogCat 都扩展了抽象类 Animal 并实现了 Sound() 方法。

我们创建它们的实例并调用该方法以产生不同的输出。


为什么使用抽象类?

我们出于以下原因在 TypeScript 中使用抽象类:

  • 为相关类定义通用结构。
  • 确保所有子类都实现特定的方法。
  • 为所有子类编写共享代码,同时允许它们定义自己的特定部分。

阅读更多

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战