TypeScript-进阶(一)-类的继承

86 阅读2分钟

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()