在TypeScript中,多态是一种允许你使用统一的接口来表示不同类型的对象的能力,从而使得代码更加灵活且可重用。TypeScript通过接口(Interfaces)和类(Classes)来实现多态,主要通过以下几种方式:
1. 接口(Interfaces)
接口定义了一组行为规范,不同的类可以实现相同的接口,这样就实现了行为的多态性。即使这些类在其他方面有所不同,但只要它们遵循了相同的接口规范,就可以被当作同一类型来处理。
示例代码:
// 定义一个接口
interface Animal {
makeSound(): void;
}
// 实现Animal接口的两个类
class Dog implements Animal {
makeSound() {
console.log('汪汪!');
}
}
class Cat implements Animal {
makeSound() {
console.log('喵喵!');
}
}
// 函数接受Animal接口类型的参数,因此可以接受Dog或Cat实例
function playSound(animal: Animal) {
animal.makeSound();
}
// 创建Dog和Cat实例并调用playSound函数
let myDog = new Dog();
let myCat = new Cat();
playSound(myDog); // 输出:汪汪!
playSound(myCat); // 输出:喵喵!
2. 类(Classes)与继承
TypeScript中的类支持继承,子类可以继承父类的属性和方法,同时也可以覆盖或扩展它们,这是面向对象编程中多态的另一种形式。通过将方法声明为抽象或在基类中使用虚方法,可以强制子类实现特定的行为,从而实现多态。
示例代码:
abstract class Animal {
abstract makeSound(): void;
}
class Dog extends Animal {
makeSound() {
console.log('汪汪!');
}
}
class Cat extends Animal {
makeSound() {
console.log('喵喵!');
}
}
function playSound(animal: Animal) {
animal.makeSound();
}
let myDog = new Dog();
let myCat = new Cat();
playSound(myDog); // 输出:汪汪!
playSound(myCat); // 输出:喵喵!
在这个例子中,Animal
是一个抽象类,它定义了一个抽象方法makeSound
。Dog
和Cat
类继承自Animal
并实现了makeSound
方法,展示了多态性。playSound
函数可以接受任何实现了Animal
接口或继承自Animal
类的对象,进一步体现了多态的灵活性。