派生类的不同构造函数签名

时间:2017-03-28 10:42:10

标签: oop typescript

如果派生类的构造函数签名与基类不同,它是否违反oop原则(例如,Liskov原则)?

class Base {
  protected x: number;  
  protected y: number;

  constructor(x: number, y: number) {
    this.x = x;
    this.y = y;
  }
}

class Derived extends Base {
  private text: string; 

  constructor(text: string, x: number, y: number) {
    super(x, y);
    this.text = text;
  }
}

1 个答案:

答案 0 :(得分:1)

不,不是,因为Liskov原则谈论"子类型"中方法参数和返回类型的逆转。当你做这样的事情时:

foo(bar:Base){
  //do stuff
}

此方法需要Base类的实例,而不是构造函数,因此方法的逆变不适用于此情况。

如果您执行此类操作,则会破坏此原则,因为Base实例无法替换为Extended实例:

 
class Base{

  foo():string{
    return "";
  }

  bar(arg:string){}

}

class Extended extends Base{

  foo():number{
    return 1;
  }

  bar(arg:boolean){}

}

但是这不是打字稿编译器所允许的。