里氏替换原则

定义:所有引用基类的地方必须能透明地使用其子类的对象(父类都可以用子类来代替,但不能改变父类原有的功能,在子类中可以任意扩展功能)

问题描述:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。

代码描述:

package com.hc.www;

class A1 {
	public int func1(int a, int b) {
		return a - b;
	}
}

class B1 extends A1 {
	public int func1(int a, int b) {
		return a + b;
	}

	public int func2(int a, int b) {
		return func1(a, b) + 100;
	}
}

public class Ceshi {
	public static void main(String[] args) {
		B1 b = new B1();
		System.out.println("100-50=" + b.func1(100, 50));
		System.out.println("100-80=" + b.func1(100, 80));
		System.out.println("100+20+100=" + b.func2(100, 20));
	}
}

结果:(结果不符合预期)
100-50=150
100-80=180
100+20+100=220

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

子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

缺点:(继承的缺点)
优点:提高代码的重用性,扩展性

LSP(里氏替换原则)与多态:
1、LSP只是针对继承来说,父类和子类均可实例化,主要是共享父类方法,子类不覆盖父类方法
2、继承如果是为了多态,那么多态前提就是父类重写子类方法,为了符合LSP,父类就应该定义为抽象类,并定义抽象方法,所以就不存在子类替换父类时逻辑不一致的可能。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值