TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为开发者提供了面向对象编程(OOP)的功能。其中,类的继承和多态性是 OOP 的两个核心概念,它们使得代码更加模块化、可维护,并且可以提高代码的复用性。
一、类的继承
继承是面向对象编程中一个非常重要的概念,它允许我们创建一个新类,该类继承了现有类的方法和属性。通过继承,子类不仅可以访问父类中的所有公共成员,还可以定义自己独有的成员。这不仅有助于代码重用,还能使程序结构更清晰。在 TypeScript 中,使用 extends
关键字来实现类的继承。
示例:
// 定义一个父类
class Animal {
name: string;
constructor(name: string) { this.name = name;
}
// 定义一个方法
makeSound() { console.log(`${this.name} makes a sound.`);
}
}
// 定义一个子类,继承自 Animal 类
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) { super(name); // 调用父类构造函数 this.breed = breed;
}
// 子类特有的方法
bark() { console.log(`${this.name} barks!`);
}
}
const dog = new Dog('Buddy', 'Golden Retriever');
dog.makeSound(); // 输出:Buddy makes a sound.
dog.bark(); // 输出:Buddy barks!
二、多态性
多态性是指不同对象对同一消息作出不同的响应的能力。简单来说,多态性允许我们将不同类型的对象视为同一个类型,并根据实际类型调用相应的方法。在 TypeScript 中,多态性通常通过方法重写(override)和接口(interface)来实现。
1. 方法重写
子类可以重写从父类继承的方法,以提供特定的行为。当调用该方法时,会执行子类中定义的版本。这样,即使通过父类引用访问子类对象,也会调用子类的方法。
示例:
// 继续上面的例子,重写 makeSound 方法
class Cat extends Animal {
constructor(name: string) { super(name);
}
// 重写父类的方法
makeSound() { console.log(`${this.name} meows!`);
}
}
const cat = new Cat('Whiskers');
cat.makeSound(); // 输出:Whiskers meows!
// 使用父类引用调用子类的方法
let animal: Animal;
animal = cat;
animal.makeSound(); // 输出:Whiskers meows!
2. 接口与多态
除了方法重写外,TypeScript 还支持通过接口实现多态性。接口定义了一组行为或属性,但不关心具体实现细节。任何实现了相同接口的类都可以被视为同一类型,从而实现多态性。
示例:
// 定义一个接口
interface ISoundMaker {
makeSound(): void;
}
// 实现接口的两个类
class Bird implements ISoundMaker {
name: string;
constructor(name: string) { this.name = name;
}
makeSound() { console.log(`${this.name} chirps!`);
}
}
class Cow implements ISoundMaker {
name: string;
constructor(name: string) { this.name = name;
}
makeSound() { console.log(`${this.name} moos!`);
}
}
// 创建一个数组存储不同类型的 ISoundMaker 对象
const soundMakers: ISoundMaker[] = [new Bird('Tweetie'), new Cow('Bessie')];
// 遍历数组并调用 makeSound 方法
soundMakers.forEach((maker) => maker.makeSound());
/ 输出:
Tweetie chirps!
Bessie moos!
/
通过上述例子可以看出,在 TypeScript 中实现类的继承和多态性是非常直观且灵活的。继承允许我们基于现有的类构建新的类,而多态性则让代码更具灵活性和可扩展性。掌握这两个概念对于编写高效、易维护的 TypeScript 程序至关重要。