实现开闭原则的过程:
1抽象
2里氏代换,Coad法则
3聚合/合成
4依赖倒置
5迪米特,隔离进行封闭。
我们下面只讨论开闭原则的”开”的分析过程:
1首先要抽象
2然后用子类去替换基类,判断是否符合里氏代换原则。
这里如果子类扩展基类后,不添加任何属性和方法,它就一定符合里氏代换。
3如果符合里氏代换,再判断是否符合Coad法则。
Coad法则有四条
A是否按照严格分类,不继承工具类
B 不置换基类中太多方法
C 不会出现一个类的子类变成另一个类的子类的情况。
D 符合”is - a”(特殊类),而不是”has – a”(角色) -自己非常不确定
下图的继承中是符合里氏代替的。
下面再看是否符合Coad
这里A,B应该是满足的。
但C,D一定不满足,为什么呢?
首先,男学生是男人的子类,但随着他开始工作,他有可能成为男医生,这还好像也没问题,但他以后会可能成为男主任医师或者男院长,也就是说男学生从男人的子类变成了男医生的子类。不满足C。
其次,一个男人一生中有很多个角色,比如:儿子,学生,医生,院长,父亲,爷爷等都是这个男人一生中可能扮演的角色。而不是男人的一个特殊类型。不满足D。
那这个继承全都错了吗?没有!
根据C的要求,如果扩展了男人类,不可能变成女人类。所以男人和女人对人的继承是正确的。而且男人和女人是人的特殊类型。
3如果前面的步骤中,如果继承中有两个类的继承关系不满足里氏代换。那么可以找出两个类的抽象类,让这两个类继承它。或者用聚合。