TS中继承和重写
在TypeScript中,我们可以使用继承(Inheritance)和重写(Overriding)来扩展和修改已有的类和接口。
- 类的继承
在TypeScript中,我们可以使用关键字extends
来实现继承。子类会自动拥有父类的所有成员(除了构造函数)。
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
move(distanceInMeters: number) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
bark() {
console.log('Woof! Woof!');
}
}
const dog = new Dog('Buddy');
dog.bark();
dog.move(10);
dog.name; // 'Buddy'
- 方法重写
当我们在子类中创建了和父类同名的方法时,这就是方法重写。
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
move(distanceInMeters: number) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
bark() {
console.log('Woof! Woof!');
}
move(distanceInMeters: number) {
console.log('Dog is moving!');
}
}
const dog = new Dog('Buddy');
dog.move(10); // 'Dog is moving!'
在上述代码中,我们在Dog类中重写了move方法。当我们创建Dog类的实例并调用move方法时,会调用Dog类中定义的move方法,而不是Animal类中的move方法。
- 属性重写
我们也可以在子类中重写父类的属性。
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
}
class Dog extends Animal {
name: string = 'Dog';
}
const dog = new Dog('Buddy');
console.log(dog.name); // 'Dog'
在上述代码中,我们在Dog类中重写了name属性。当我们创建Dog类的实例并访问name属性时,会访问Dog类中定义的name属性,而不是Animal类中的name属性。
- 存取器重写
我们也可以在子类中重写父类的属性的getter和setter。
class Animal {
private _name: string;
get name() {
return this._name;
}
set name(value: string) {
this._name = value;
}
}
class Dog extends Animal {
get name() {
return 'Dog ' + this._name;
}
set name(value: string) {
this._name = 'Dog ' + value;
}
}
const dog = new Dog();
dog.name = 'Buddy';
console.log(dog.name); // 'Dog Buddy'
在上述代码中,我们在Dog类中重写了name属性的getter和setter。当我们创建Dog类的实例并访问或设置name属性时,会调用Dog类中定义的getter和setter。
评论已关闭