设计模式之里氏替换原则
设计模式之里氏替换原则继承的弊端:
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。 里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。 里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
①子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
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()); } } ======================================================================= 结束。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |