美文网首页
里式替换原则(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