七大设计原则之里氏替换

首页 » 设计模式 » 七大设计原则之里氏替换

所有引用基类的地方必须能透明的使用其子类的对象;在使用继承时,在子类中尽量不要重写父类的方法

违反原则例子

package 里氏替换;

public class test {
public static void main(String[] args) {
 A a=new A();
 System.out.println("11-3="+a.fun1(11, 3));
 System.out.println("1-8="+a.fun1(1, 8));
 System.out.println("-----------------------");
 B b=new B();
 System.out.println("11-3="+b.fun1(11, 3));
 System.out.println("1-8="+b.fun1(1, 8));
 System.out.println("11+3+9"+b.fun2(11, 3));
}
}
class A{
 public int fun1(int num1,int num2) {
  return num1-num2;
 }
}
class B extends A{
 public int fun1(int a,int b) {
  return a+b;//无意间重写
 }
 public int fun2(int a,int b) {
  return fun1(a,b)+9;
 }
}

 

七大设计原则之里氏替换
运行结果

改进后

package 里氏替换;

public class test {
public static void main(String[] args) {
 /*
  * 原因:可能是无意中重写了父类的方法
  * 解决办法
  * 原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉。
  */
 A a=new A();
 System.out.println("11-3="+a.fun1(11, 3));
 System.out.println("1-8="+a.fun1(1, 8));
 System.out.println("-- ---------------------");
 B b=new B();
 //因为B类不再继承A类,因此调用者不会再认为fun1是求减法的类
 System.out.println("11+3="+b.fun1(11, 3));
 System.out.println("1+8="+b.fun1(1, 8));
 System.out.println("11+3+9"+b.fun2(11, 3));
 
 //使用组合仍然可以使用到A的相关方法
 System.out.println("11-3="+b.fun3(11, 3));
}
}
//创建一个更基础的类
class Base{
 //基础方法
}
class A extends Base{
 public int fun1(int num1,int num2) {
  return num1-num2;
 }
}
class B extends Base {
 //如果B类需要使用A类的方法,就使用组合关系
 private A a=new A();
 //我们仍然想使用A类的方法
 public int fun3(int a,int b) {
  return this.a.fun1(a, b);
 }
 
 public int fun1(int a,int b) {
  return a+b;
 }
 public int fun2(int a,int b) {
  return fun1(a,b)+9;
 }
 
}

 

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

 



觉得文章有用就打赏一下弟弟吧

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.5主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
正在播放:

作者想对您说:

累了就停下来听首歌吧

听完后会给您一个好心情

最后

等到您不容易

还希望您能多待一会儿

      00:00/00:00