加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

设计模式之里氏替换原则

发布时间:2020-12-14 02:10:04 所属栏目:百科 来源:网络整理
导读:设计模式之里氏替换原则 继承的弊端: 继承作为面向对象三大特性之一,在给程序设计带来巨大便利的同时,也带来了弊端。例如: 1、继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法。 2、降低代码的灵活性。子类必须拥有父类的属性和方法,让子类

设计模式之里氏替换原则

继承的弊端:
继承作为面向对象三大特性之一,在给程序设计带来巨大便利的同时,也带来了弊端。例如:
1、继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法。
2、降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束。
3、增强了耦合性。当父类的常量、变量和方法被修改时,必需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果,大片的代码需要重构。


里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。

里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。


①子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。

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


②子类中可以增加自己特有的方法。

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


③当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

public class Father {
    public void func(HashMap m){
        System.out.println("执行父类");
    }
}
 
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);
    }
}


④当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

public abstract class Father {
    public abstract Map func();
}
 
public class Son extends Father{
     
    @Override
    public HashMap func(){//方法的返回值比父类的更严格
        HashMap h = new HashMap();
        h.put("h","执行子类");
        return h;
    }
}
 
public class Client{
    public static void main(String[] args) {
        Father f = new Son();//引用基类的地方能透明地使用其子类的对象。
        System.out.println(f.func());
    }
}


=======================================================================

结束。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读