Typescript中的多态、抽象类、接口

2022-03-16  本文已影响0人  wyc0859

多态:

父类的对象变量可以接受任何一个子类的对象
从而用这个父类的对象变量来调用子类中重写的方法而输出不同的结果.

产生多态的条件: 1.必须存在继承关系 2.必须有方法重写

多态的好处: 利于项目的扩展【从局部满足了 开闭原则--对修改关闭,对扩展开放】

多态的局限性: 无法直接调用子类独有方法,必须结合instanceof类型守卫来解决

抽象类:

和普通类区别:
1、多abstract 关键字,且不能被实例化
2、有抽象方法(但不能有方法体),子类必须重写抽象方法

abstract class People {
  public name!: string;

  //抽象方法,子类必须重写
  public abstract info(): void; //不能有方法体

  //不是抽象方法,子类不用必须重写
  public eat() {
    console.log("人类-吃饭");
  }
}

class Man extends People {
  public info() {
    console.log("男人");
  }
}

class Woman extends People {
  public bar() {
    console.log("女人特征");
  }
  public info() {
    console.log("女人");
  }
}

class girl extends People {
  public info() {
    console.log("女孩");
  }
}
// 父类的对象变量people可以接受任何一个子类的对象,
let people: People = new Woman();
// 从而用这个父类的对象变量来调用子类中重写的方法而输出不同的结果.
people.info();
people = new Man();
people.info();
//无法直接调用子类独有方法
//people.bar();//未编译就报错:类型“People”上不存在属性“bar”
people = new girl();
people.info();

适配器: interface + 抽象类

interface People {
  names: string;
  eat(): void;
  school(): void;
}

class XiaoZ implements People {
  public names = "小张";
  eat() {
    console.log("小张吃饭");
  }
  school() {
    console.log("小张在上学");
  }
}

由于接口(implements),必须实现所有方法。但老张并不上学,该怎么去掉school?
abstract class Man implements People {
  public abstract names: string;
  public abstract eat(): void;
  public school() {}
}
class LaoZ extends Man {
  public names = "老张";
  eat() {
    console.log("老张吃饭");
  }
}

以上方法完美解决,这样的抽象类也称为适配器

上一篇 下一篇

猜你喜欢

热点阅读