2017-03-28 51 views
2

如果派生類的構造函數簽名與基類不同,它是否會破壞oop原理(ex,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

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

} 

但這不是由打字稿編譯器允許的。

相關問題