設計模式--里氏替換原則
阿新 • • 發佈:2021-01-09
技術標籤:設計模式
所有引用基類的地方必須能透明地使用其子類的物件
繼承在帶來便利的同時給程式帶來了侵入性,試想一個類被繼承後,父類的任意修改都要考慮到子類。如何正確的使用繼承-----裡式替換原則
裡式替換原則告訴我們
-
在使用繼承時,儘量不要重寫父類的方法(子類重寫了父類的方法,使用父類的地方就不能透明地使用子類了,因為邏輯不一樣了)
-
繼承實際上讓兩個類之間耦合性增強了,在適當情況下,可以通過聚合,組合,依賴來解決問題
程式碼
class A { public int function1(int num1, int num2) { return num1 - num2; } }
class B extends A {
public int function1(int num1, int num2) {
return num1 + num2;
}
public int function2(int num1, int num2) {
return num1 * num2;
}
}
如上,如果B在不知情的情況下重寫了functionA,那麼A作為基類,他使用的地方如果換成子類B,結果會發生變化,遵循裡式替換原則,修改如下
class Base {
//把更加基礎的方法和成員寫到Base類
}
class A extends Base { public int function1(int num1, int num2) { return num1 - num2; } }
class B extends Base {
public int function1(int num1, int num2) {
return num1 + num2;
}
public int function2(int num1, int num2) {
return num1 * num2;
}
}
以上,如果B還是想用A的方法,可以採用依賴、聚合、組合的方式,修改如下
class B extends Base { private A a = new A(); public int function1(int num1, int num2) { return num1 + num2; } public int function2(int num1, int num2) { return num1 * num2; } //呼叫A的function1 public int function3(int num1, int num2) { return a.function1(num1, num2); } }