5
回答
继承好,还是组合好?各自因该在那种场景下使用?
华为云实践训练营,热门技术免费实践!>>>   

最近自己在写一个简单的平台,很多地方都用了继承来扩展,但是看一些文章里写到,能用组合尽量不要用继承,WHY?WHY?WHY?

请大牛指点!!!

<无标签>
举报
达不溜H
发帖于3年前 5回/711阅
共有5个答案 最后回答: 3年前

给你看2个图片,我相信你能比较清楚的明白使用继承,组合的场景。

这是继承UML类图


这是聚合UML类图



PS:聚合,组合都是关联的一种,组合比聚合关系更强。聚合表现为整体与部分,但整体与部分生命周期可以不同。组合也是整体与部分,但是部分的生命周期依赖整体。

第二个图片就是GOF中的《桥接模式》了。

--- 共有 1 条评论 ---
金拱门够典型的 3年前 回复

继承的优点在于复用,缺点在于往往连 BUG 也复用过去,特别是层次越是深,BUG 的扩散所产生的问题,就越是严重。

所以大师们的建议:如果你拿不定主意,组合优先于继承。

引用来自“杨志兵”的评论

给你看2个图片,我相信你能比较清楚的明白使用继承,组合的场景。

这是继承UML类图


这是聚合UML类图



PS:聚合,组合都是关联的一种,组合比聚合关系更强。聚合表现为整体与部分,但整体与部分生命周期可以不同。组合也是整体与部分,但是部分的生命周期依赖整体。

第二个图片就是GOF中的《桥接模式》了。

貌似例子不对。
继承和组合是is_a和has_a的关系。
继承的问题是,子类知道父类的实现,并往往依赖于相关的实现,导致,互相的依赖很严重。而且现实上,类内部的模型往往会变更,这样的改动太大。另外,继承层次过多,导致逻辑分支越多,到后期你想新建一个子类都很难。
而组合,暴露的只有接口,对象间通过接口交互,可以方便的变更某个部分而不影响全局。
最近我甚至在怀疑面向对象,是不是用面向动作来说比较好,只有结构和动作接口。抽象就留给上帝吧。
--- 共有 5 条评论 ---
夏涌升回复 @抓瓦工人 : 我列个去。。。。 3年前 回复
_-___回复 @夏涌升 : 同意前面这位老兄的话,不同意你说的,因为你的理论太多 3年前 回复
夏涌升回复 @杨志兵 : 我没读过什么书,所以说的没那么严密哈。 你说的整体和部分,我觉得是结构的一种形式。组合和关联,在这个语境下我们不区分哈。 3年前 回复
杨志兵回复 @杨志兵 : 写错了2个字: 在代表的表现上体现为 =》 在代码的表现上体现为 3年前 回复
杨志兵不能完全苟同 组合并不是你理解的只有接口。 组合体现的是:整体与部分,并且整体与部分生命周期同时在,同时亡的一种关系。 在代表的表现上体现为:部分在整体中是属于成员变量。 3年前 回复

没有银弹!!结合实际情况考虑

继承多了也是个蛋疼得不得了的事情!明明很简单的东西,你硬给他搞n层的继承关系!其实你根本用不到,一个简单的类就搞定了!


你只需要知道继承和组合的概念,作用,that's all!

其他所有情况,根据实际情况去分析!


就像异步技术喝同步提交技术各有各的使用场景一样!你光说一个题目,没有答案给你

继承能复用,当然是继承好——虽然通用的继承类实现起来不容易。

但是,常用的语言只有C++能多继承,如果已经面向一个侧面进行继承,就无法再往另一个侧面继承。举个例子:一个物件可以绘画,你设计了以绘图为目的的继承树,突然有一天又想以日志为线索进行设计,结果就悲惨了——不肯能实现!只好用组合来模拟继承的原理,N多的接口,N多的代码复制,一处改了,类似的地方要一个个改过去。

顶部