浅谈是否用继承来利用

来源:互联网 发布:mac解压软件知乎 编辑:程序博客网 时间:2024/06/06 00:16

实现开闭原则的过程:

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如果前面的步骤中,如果继承中有两个类的继承关系不满足里氏代换。那么可以找出两个类的抽象类,让这两个类继承它。或者用聚合。

原创粉丝点击