1.继承
如果A和B都是类,并且可以描述A是B,则A和B是继承的关系
- A的玩家坦克
- B是坦克
- A是B
- 即A也是坦克
- 即B是父类
- A是子类
- A继承于B
2.继承父类所有的成员
在继承中,子类拥有父类的所有成员
class TankB {
name: string = '坦克'
getName() {
console.log(this.name);
}
}
class TankA extends TankB {
name: string = '玩家坦克'
}
const tankA: TankA = new TankA()
// 子类可以使用父类的方法
tankA.getName() // 玩家坦克
3.重写父类的成员
重写父类时,必须保持类型一致
class TankB {
name: string = '坦克'
getName():number {
console.log(this.name);
return 1212
}
}
class TankA extends TankB {
// 这里重写了父类的属性,但类型必须为字符串
name: string = '玩家坦克'
// 重写父类的方法,但返回值必须为number,即不能更改类型
getName():number {
return 1212333
}
}
4.this的指向
在继承关系中,this的指向的动态的,即调用方法时,根据调用者确定this的指向
class TankB {
name: string = '坦克'
getName() {
console.log(this.name);
}
}
class TankA extends TankB {
name: string = '玩家坦克'
}
const tankA: TankA = new TankA()
tankA.getName() // 玩家坦克
const tankB: TankB = new TankB();
tankB.getName() // 坦克
5.super关键字
super关键字可以使用父类的资源
class TankB {
name: string = '坦克'
getName() {
console.log(this.name);
}
}
class TankA extends TankB {
name: string = '玩家坦克'
getTest(){
// 调用父级的资源
super.getName()
}
}
const tankA: TankA = new TankA()
tankA.getTest(); // 玩家坦克
6.super与this的区别
- super可以获取父类资源
- this是调用自身的资源
- 但是若自身没有该成员,则this调用的是父类的成员
class TankB {
name: string = '坦克'
getName() {
console.log(this.name);
}
}
class TankA extends TankB {
name: string = '玩家坦克'
getName() {
console.log('我是自身的getName');
}
getTest() {
// 调用父级的资源
super.getName()
// 调用自身的资源
this.getName()
}
}
const tankA: TankA = new TankA()
tankA.getTest();
// 玩家坦克
// 我是自身的getName
7.类的匹配
子类的对象,可以赋值给父类,但是如果赋值了父类,则无法调用非父类的资源
但可以通过instanceof进行实例判断
class TankB {
name: string = '坦克'
getName() {
console.log(this.name);
}
}
class TankA extends TankB {
name: string = '玩家坦克'
swim() { }
}
const tankA: TankB = new TankA()
if (tankA instanceof TankA) {
tankA.swim()
}
8.单根性和传递性
- 单根性:每个类只能继承一个父类
- 传递性:如果A类是B类的父级,B类是C类的父级,那么A类是C类的父级
class TankA {
name: string = '坦克'
getName() {
console.log(this.name);
}
}
class TankB extends TankA {
name: string = '玩家坦克'
}
class TankC extends TankB { }
const tankC: TankA = new TankC()