在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 编译器会报错,因为抽象类不能被实例化。只有当子类实现了所有抽象方法之后,才能被正确地实例化和使用。