美文网首页
里式替换原则(LSP)

里式替换原则(LSP)

作者: Moonsmile | 来源:发表于2017-02-16 13:14 被阅读0次

    讲继承
    所有引用父类的地方都必须可以透明的使用其子类对象
    几个原则:
    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);
        }
    }
    
    

    运行结果:执行父类

    相关文章

      网友评论

          本文标题:里式替换原则(LSP)

          本文链接:https://www.haomeiwen.com/subject/gozcwttx.html