《TypeScript实战指南》—3.2.3 继承
3.2.3 继承
在TypeScript里,我们可以使用常用的面向对象模式。基于类的程序设计中一种最基本的模式是允许使用继承来扩展现有的类。
看下面的例子:
class Animal {
move(distanceInMeters: number = 0) {
console.log(`Animal moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
bark() {
console.log('Woof! Woof!');
}
}
const dog = new Dog();
dog.bark();
dog.move(10);
dog.bark();
这个例子展示了最基本的继承:类从基类中继承了属性和方法。这里,Dog是一个“派生类”,它通过extends关键字派生自Animal“基类”。派生类通常称为“子类”,基类通常称为“超类”。
因为Dog继承了Animal的功能,因此可以创建一个Dog的实例,能够执行bark()和move()。
下面我们来看一个更加复杂的例子:
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) { super(name); }
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
class Horse extends Animal {
constructor(name: string) { super(name); }
move(distanceInMeters = 45) {
console.log("Galloping...");
super.move(distanceInMeters);
}
}
let sam = new Snake("Sammy the Python");
let tom: Animal = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
这个例子展示了一些上面没有提到的特性。这一次,我们使用extends关键字创建了Animal的两个子类:Horse和Snake。
与前一个例子的不同点是,派生类包含了一个构造函数,它必须调用super(),并会执行基类的构造函数。而且,在构造函数里访问this的属性之前一定要调用super()。这是TypeScript强制执行的一条重要规则。
这个例子演示了如何在子类里重写父类的方法。Snake类和Horse类都创建了move方法,它们重写了从Animal继承来的move方法,使得move方法根据不同的类而具有不同的功能。注意,即使tom被声明为Animal类型,但因为它的值是Horse,调用tom.move(34)时,它会调用Horse里重写的方法,如下所示:
Slithering...
Sammy the Python moved 5m.
Galloping...
Tommy the Palomino moved 34m.
- 点赞
- 收藏
- 关注作者
评论(0)