您的位置:首页 > 其它

"is-a"关系不能决定继承

2005-05-27 14:43 197 查看
      
看过很多面向对象设计的书,一般都使用这种方法帮我们判断是选择继承还是选择组合:“is-a
关系选择继承,has-a关系选择组合”。

 

 

      
但是这个只是初期的一般指导,我认为还有另一个因素:从到底是扩展父类接口还是压缩父类接口考虑。

 

 

      
考虑下面这个经典设计问题:有矩形类和正方形类,他们之间是否该使用继承?

 

 

      
正方形就是一个特殊的矩形,按照前面的方法,应该从矩形类继承没有问题。但是经典的设计解决方案没有这样做,而是把这两个类放在了同一个层次。(具体是哪本书忘了)

 

 

      
分析原因:

正方形是一个矩形,没错。但是正方形不应该像矩形一样既有设置长的操作,也有设置宽的操作。所以正方形需要的接口其实小于矩形的接口,如果强制使其接口扩大,只会使人对正方形的概念模糊。

      
其实,我们再来真正考虑一下到底继承做了些什么:增加属性、扩大接口。而这里正方形刚好两个都不需要。

同时,我们也可以看到使用继承关系时,这种一般和特殊的关系是通过增加属性和操作来做的。这种一般和特殊关系没有考虑到另一点:有时候特殊是对一般的某些一般性进行限制的。这里正方形就是对矩形本身的东西进行限制,限制其长宽相等。这不是通过增加某些东西来特殊话,而是改变原来的东西进行的特殊化。这种情况下,继承就是一个不好的解决方案。

by:kangtian0

附:
      
其实单纯给类增加属性的时候,这时候还面临另一个选择方案:使用Decorator模式。这种情况下选择Decotator模式还是继承是竞争的,根据你的需要而定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  decorator 扩展 qq
相关文章推荐