2016-01-10 85 views
2

關於Liskov替換原則(LSP),它聲明派生類的對象可以在不會導致程序執行失敗的情況下代替它的基類對象。Java LSP「派生對象可以替代基礎對象」

如果我的父類是一個抽象基類的功能是什麼:

public abstract class BaseClass { 
    public void heal() { 
     health++; 
    } 
} 

我可以覆蓋的持續治療方法在派生類中,它仍然是有效的LSP-原則如:

public class ChildClass extends BaseClass { 
    @Override public void heal() { 
    super.heal(); 
    super.heal(); 
} 

Programm仍然會執行,我可以將ChildClass-Objects傳遞給需要BaseClass-Object作爲參數的方法。然而,這兩個heal()方法表現出略有不同的地方。

我可以在不傷害LSP的情況下覆蓋其子類中抽象基類的具體方法嗎?

回答

3

只要基類合同得到遵守,您就可以在派生類方法中實現任何邏輯。合同是由類和它們的方法提供的保證,通常在文檔中描述。一些語言提供更形式化的合同規範,例如編譯時間斷言。方法簽名也可以被視爲合同的一部分。

如果您的heal方法記錄爲「向對象的健康添加一個點」,那麼其他使用您的BaseClass的類將依賴於僅添加一個點。在這種情況下,重寫heal向健康添加任何其他金額將違反合同並違反LSP。相反,如果heal是一種「爲對象的健康添加一些點」的方法,那麼其他類不允許對添加量的實際含義提出任何建議 - 他們唯一可以依賴的是,例如,在致電heal之前,調用此方法後的health不小於health。在這種情況下,您的覆蓋不會違反LSP,也不會破壞程序。

相關問題