裡式替換原則(LSP)

weixin_34107955發表於2017-02-16

講繼承
所有引用父類的地方都必須可以透明的使用其子類物件
幾個原則:
1、子類必須完全實現父類的方法
2、子類可以有自己的個性
3、覆蓋或實現父類的方法時輸入引數可以被放大
4、覆寫或實現父類的方法時輸出結果可以縮小

public class C {
    public int func(int a, int b){
        return a+b;
    }
}
 
public class C1 extends C{
    @Override
    public int func(int a, int b) {
        return a-b;
    }
}
 
public class Client{
    public static void main(String[] args) {
        C c = new C1();
        System.out.println("2+1=" + c.func(2, 1));
    }

執行結果:2+1=1##

上面的執行結果明顯是錯誤的。類C1繼承C,後來需要增加新功能,類C1並沒有新寫一個方法,而是直接重寫了父類C的func方法,違背里氏替換原則,引用父類的地方並不能透明的使用子類的物件,導致執行結果出錯。


覆蓋或實現父類的方法時輸入引數可以被放大


import java.util.HashMap;
public class Father {
    public void func(HashMap m){
        System.out.println("執行父類...");
    }
}
//map 比hashmap更寬鬆 
import java.util.Map;
public class Son extends Father{
    public void func(Map m){//方法的形參比父類的更寬鬆
        System.out.println("執行子類...");
    }
}
 
import java.util.HashMap;
public class Client{
    public static void main(String[] args) {
        Father f = new Son();//引用基類的地方能透明地使用其子類的物件。
        HashMap h = new HashMap();
        f.func(h);
    }
}

執行結果:執行父類

相關文章