架构设计基本原则之里式替换原则(LSP)
里式替换原则(LSP)
LSP
,Liskov Substitution Principle
, 里氏替换原则
里氏替换原则的定义
里式替换阐述了继承的原则,可描述为:子类可以扩展父类的功能,但是不能改变父类原有的功能。
https://zhuanlan.zhihu.com/p/268574641
里式替换的作用
- 里式替换是实现开闭原则的重要方式之一。
- 克服了继承中重写父类造成的可复用性变差的特点。
- 他是总动作正确性的保证。类的扩展不会给系统带来新的错误,降低了代码出错的可能性。
- 加强程序的健壮性。提高了兼容性、可维护性和可获展性,降低了需求变更带来的风险。
里氏替换原则的实现方法
里式替换的定义总结:
子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36/**
* @name: C
* @author: terwer
* @date: 2022-04-15 18:27
**/
public class C {
public int func(int p1, int p2) {
return p1 + p2;
}
}
/**
* @name: C1
* @author: terwer
* @date: 2022-04-15 18:28
**/
public class C1 extends C {
public int func(int p1, int p2) {
return p2 - p1;
}
}
/**
* @name: Client
* @author: terwer
* @date: 2022-04-15 18:28
**/
public class Client {
public static void main(String[] args) {
C c = new C1();
int result = c.func(1, 2);
System.out.println("1+2=" + result);
}
}运行结果:1+2=1
子类可以增加自己特有的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25/**
* @name: C2
* @author: terwer
* @date: 2022-04-15 18:35
**/
public class C2 extends C {
public int func2(int p1, int p2) {
return p2 - p1;
}
}
/**
* @name: Client
* @author: terwer
* @date: 2022-04-15 18:28
**/
public class Client {
public static void main(String[] args) {
C2 c2 = new C2();
int result1 = c2.func(1, 2);
System.out.println("1+2=" + result1);
int result2 = c2.func2(1, 2);
System.out.println("2-1=" + result2);
}
}运行结果:
1+2=3
2-1=1