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

标签 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;
  }
}

最佳答案

不,不是,因为 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){}

}

但是 typescript 编译器不允许这样做。

关于oop - 派生类的不同构造函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43067415/

相关文章:

javascript - 在 Javascript 中扩展原型(prototype) - 好方法?

oop - "dependency inversion principle"在 OOP 中是什么意思?

typescript - 不一致的 TypeScript 行为

typescript - 使用字符串值创建枚举

javascript - 类型 'T' 不可分配给类型 'Dictionary<string>

javascript - 如何向对象添加键值对?

javascript - 在方法内动态声明新的 "Class fields"- 好习惯与否?

php - PHP 高级 OOP 特性的真实示例

python - 在Python中生成具有不同属性的新对象实例

javascript - typescript 每次特定时间调用一个函数