在TypeScript中,你可以直接使用abstract
关键字来定义抽象类和抽象方法。抽象类不能被实例化,而抽象方法必须在派生类中被实现。以下是一个具体的例子:
abstract class Animal {name: string;constructor(name: string) {this.name = name;}// 抽象方法,不需要实现具体功能abstract speak(): string;// 可以有非抽象方法move(distanceInMeters: number = 0): void {console.log(`${this.name} moved ${distanceInMeters}m.`);}
}// 具体子类 Dog,继承自抽象类 Animal
class Dog extends Animal {constructor(name: string) {super(name);}// 实现抽象方法speak(): string {return `${this.name} says Woof!`;}
}// 另一个具体子类 Cat,同样继承自抽象类 Animal
class Cat extends Animal {constructor(name: string) {super(name);}// 实现抽象方法speak(): string {return `${this.name} says Meow!`;}
}// 尝试实例化抽象类 Animal 将会得到编译时错误
// const animal = new Animal('Generic');// 实例化具体子类
const dog = new Dog('Rex');
console.log(dog.speak()); // 输出: Rex says Woof!
dog.move(5);const cat = new Cat('Felix');
console.log(cat.speak()); // 输出: Felix says Meow!
cat.move();
在这个例子中,Animal
是一个抽象类,它包含了一个抽象方法 speak()
和一个普通方法 move()
。Dog
和 Cat
类继承自 Animal
并且都必须实现 speak()
方法(是必须,不然会报错)。如果你试图直接实例化 Animal
类,TypeScript 编译器会报错,因为抽象类不能被实例化。只有当子类实现了所有抽象方法之后,才能被正确地实例化和使用。