如果派生类的构造函数签名与基类不同,这是否违背了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;
}
}发布于 2017-03-28 11:08:03
不,没有,因为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){}
}但是,类型记录编译器不允许这样做。
https://stackoverflow.com/questions/43067415
复制相似问题