设计模式面向对象七大原则(三)——里氏代换原则(Liskov Substitution Principle)

探讨里氏代换原则在面向对象编程中的应用,规范继承时子类的书写规则,保持父类方法不被覆盖,提高代码的扩展性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

里氏代换原则——使得开放封闭成为可能
一、继承的优缺点
1 继承的优点:
1)、子类拥有父类的所有方法和属性,从而可以减少创建类的工作量。
2)、提高了代码的重用性。
3)、提高了代码的扩展性,子类不但拥有了父类的所有功能,还
可以添加自己的功能。
2继承的缺点:
1 )、 继承是侵入性的。只要继承,就必须拥有父类的所有属性和
方法。
2)、降低了代码的灵活性。因为继承时,父类会对子类有一种约束。
3)、增强了耦合性。当需要对父类的代码进行修改时,必须考虑到对子类产生的影响。有时修改了一点点代码都有可能需要对大段程序进行重构。
################################
例:

package liskov;
class A{
	public int func1(int num1, int num2){
		return num1-num2;  }
}
class B extends A{
  public int func1(int a,int b){
    return a+b;}
  public int func2(int a, int b){
    return func1(a,b)+9;}
}

public class Liskov {

	public static void main(String[] args) {
		A a = new A();
		System.out.println("11-3=" +a.func1(11,3));
		System.out.println("1-8="+a.func1(1,8));
		System.out.println ("-------");
		B b = new B();
		System.out.println("11-3=" + b.func1(11,3));
		//这里本意是求出11-3
		System.out.println("1-8="+ b.func1(1,8));
		System.out.println("11+3+9="+b.func2(11,3));
	}
}

分析:
原来运行正常的相减功能发生了错误。原因就是类B重写了父
类的方法func1,造成原有功能出现错误。 在实际编程中,常常会通过重写父类的方法完成新的功能,
这样写起来虽然简单,但整个继承体系的复用性会比较差。
特别是运行多态比较频繁的时候。
*** 问题提出:***在编程中,如何正确的使用继承? ——里氏替换原则
#######修改后——利用了里氏替换原则

package liskov;
//创建-个更加基础的基类
class Base {
//把更加基础的方法和成员写到Base类
}
// A类
class A extends Base {
//返回两个数的差
  public int func1(int num1, int num2) {
	  return num1 - num2;  }
}
class B extends Base{
  A a=new A();
  public int func1(int a,int b){
	  return a+b;	}
  public int func2(int a, int b){
	  return func1(a,b)+9;	}
  public int func3(int a, int b){
	  return this.a.func1(a,b);	}
}

public class Liskov {
  public static void main(String[] args) {
	A a = new A();
	System.out.println("11-3=" +a.func1(11,3));
	System.out.println("1-8="+a.func1(1,8));
	System.out.println ("-------");
	B b= new B();
	//因为B类不再继承A类,因此调用者,不会再func1是求减法
	//调用完成的功能就会很明确
	System. out.println("11+3=" + b. func1(11, 3));//这里本意是求出11+3
	System. out.println("1+8=" + b.func1(1, 8));// 1+8
	System. out.println("11+3+9=" + b.func2(11, 3));
	//使用组合仍然可以使用到A类相关方法
	System. out.println("11-3=" + b.func3(11, 3));// 这里本意是求出11-3
	}	
}
***总结***
``` 只要有父类出现的地方,都可以使用子类来替代。而且不
会出现任何错误或者异常。
 但是反过来却不行。子类出现的地方,不能使用父类来替代。
 里氏代换原则的主要作用:规范继承时子类的一些书写规
则。其主要目的就是保持父类方法不被覆盖。
 子类必须实现父类的抽象方法,但不得重写(覆盖)父
类的非抽象(已实现)方法设计接口或抽象类,由子类来实现抽象方法,这里使用的其实就是里氏代换原则。里氏代换原则规定,子类不能覆写父类已实现的方法。父类中已实现的方法其实是一种已定好的规范和契约,如果随意修改它,那么可能会带来意想不到的错误。
 子类中可以增加自己特有的方法(可以随时扩展)
子类继承了父类,拥有了父类和方法,同时还可以定义自
己有,而父类没有的方法。这是在继承父类方法的基础
上进行功能的扩展,符合里氏代换原则。
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值