如果派生类的构造函数签名与基类不同,它是否违反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;
}
}
答案 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){}
}
但是这不是打字稿编译器所允许的。