课堂笔记:设计原则之李氏替换原则

定义:子类可以扩展父类功能,但不可改变父类的功能。
原则一、子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象方法。
原则二、子类可以增加自己特有的方法。
原则三、当子类覆盖或实现父类方法时,方法的前置条件(即方法的形参)要比父类方法的前置条件更宽松。
原则四、当子类覆盖或实现父类方法时,方法的后置条件(即方法的返回值)要比父类方法的后置条件更严格。

比如如下场景,子类覆盖了父类的非抽象方法,不满足李氏替换原则,子类再无机会调用父类的方法。

public class Father {
	public int func1(int a, int b) {
		return a + b;
	}
}
public class Son extends Father {
	public int func1(int a, int b) {
		return a - b;
	}
}

解决方法:将func1重命名为sub即可。

再看如下场景,父类方法的形参比子类的宽松,会导致父类侵入问题:

import java.util.HashMap;
import java.util.Map;

class Father {
	public void func1(Map map) {
		System.out.println("父类的func1");
	}
}
class Son extends Father {
	public void func1(HashMap map) {
		System.out.println("子类的func1");
	}
}
public class Test {
	public static void main(String[] args) {
		Map map = new HashMap();
		Son son = new Son();
		son.func1(map);
	}
}

注意这里我为了图方便,把3个类写到同一个文件里了。
这里调用son.func1看到输出是父类的,应该把子类的形参改为Map,父类形参改为HashMap,才能调用子类的方法。(不过这里我有一个疑惑,为什么非得用Map map = new HashMap())。

对于原则四的例子只要将形参改为返回值即可演示,这里不再赘述。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值