1. 程式人生 > 其它 >設計模式--里氏替換原則

設計模式--里氏替換原則

技術標籤:設計模式

所有引用基類的地方必須能透明地使用其子類的物件

繼承在帶來便利的同時給程式帶來了侵入性,試想一個類被繼承後,父類的任意修改都要考慮到子類。如何正確的使用繼承-----裡式替換原則

裡式替換原則告訴我們

  • 在使用繼承時,儘量不要重寫父類的方法(子類重寫了父類的方法,使用父類的地方就不能透明地使用子類了,因為邏輯不一樣了)

  • 繼承實際上讓兩個類之間耦合性增強了,在適當情況下,可以通過聚合,組合,依賴來解決問題

程式碼

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);
    }
}