看过很多面向对象设计的书,一般都使用这种方法帮我们判断是选择继承还是选择组合:“is-a 关系选择继承,has-a关系选择组合”。
但是这个只是初期的一般指导,我认为还有另一个因素:从到底是扩展父类接口还是压缩父类接口考虑。
考虑下面这个经典设计问题:有矩形类和正方形类,他们之间是否该使用继承?
正方形就是一个特殊的矩形,按照前面的方法,应该从矩形类继承没有问题。但是经典的设计解决方案没有这样做,而是把这两个类放在了同一个层次。(具体是哪本书忘了)
分析原因:
正方形是一个矩形,没错。但是正方形不应该像矩形一样既有设置长的操作,也有设置宽的操作。所以正方形需要的接口其实小于矩形的接口,如果强制使其接口扩大,只会使人对正方形的概念模糊。
其实,我们再来真正考虑一下到底继承做了些什么:增加属性、扩大接口。而这里正方形刚好两个都不需要。
同时,我们也可以看到使用继承关系时,这种一般和特殊的关系是通过增加属性和操作来做的。这种一般和特殊关系没有考虑到另一点:有时候特殊是对一般的某些一般性进行限制的。这里正方形就是对矩形本身的东西进行限制,限制其长宽相等。这不是通过增加某些东西来特殊话,而是改变原来的东西进行的特殊化。这种情况下,继承就是一个不好的解决方案。
by:kangtian0
e-mail:dunanshan@163.com
QQ:22724092
附:
其实单纯给类增加属性的时候,这时候还面临另一个选择方案:使用Decorator模式。这种情况下选择Decotator模式还是继承是竞争的,根据你的需要而定。