问鼎娱乐app苹果下载 为什么更推荐使用组合而非继承关系?
前言
最近在看公司项目的代码,看到很多继承体系,而且有好几层继承,维护和阅读起来非常困难。查了一些资料,包括《Effective Java》这本书的第16篇文章都提到了“组合优先于继承”。那么继承会暴露什么问题呢?为什么更推荐优先使用组合呢?
继承问题
说实话,为什么项目中会大量使用继承呢?我猜设计最初版本的人是想实现代码重用,但是它确实带来了很多问题。
继承是面向对象编程的重要特性之一,它在语义上表达了is-a关系,但是却破坏了封装性,我们来看一个例子:
假设我们要设计一个关于鸟类的类。我们把“鸟类”这样的抽象概念定义为抽象类 AbstractBird,它有默认的进食行为。所有更详细的鸟类,比如麻雀、鸽子、鸵鸟等,都继承了这个抽象类。
public class AbstractBird {
//... 省略其他属性和方法...
public void eat() { //... }
}
// 鸵鸟
public class Ostrich extends AbstractBird {
}
但是,有不懂情况的人按照需求给 AbstractBird 添加了 fly() 行为。但是,鸵鸟这个子类是飞不起来的问鼎娱乐电子游戏,你什么都不做,就相当于赋予了鸵鸟飞的能力,不符合设计。聪明的你想到了,于是重写了下面这段代码,抛出异常,如下所示:
public class AbstractBird {
//... 省略其他属性和方法...
public void eat() { //... }
public void fly() { //... }
}
// 鸵鸟
public class Ostrich extends AbstractBird {
//... 省略其他属性和方法...
public void fly() {
throw new UnSupportedMethodException("I can't fly.'");
}
}
这种设计思路虽然能解决问题,但不够优雅。因为除了鸵鸟,还有很多不会飞的鸟,比如企鹅。对于这些不会飞的鸟,我们需要重写 fly() 方法并抛出异常。而且,对于鸵鸟和企鹅来说,真正好的设计不应该向它们暴露 fly() 这种不该暴露的接口,增加外部调用的负担。
这里只说了 fly(),如果还有下蛋()、唱歌()等那么多行为,总不能全部冗余在父类里吧,关键我们项目同事基本把所有类都写到父类里了,维护起来确实有点困难。
我们来总结一下继承带来的问题:
子类继承了父类的所有行为,可能会无意中暴露不必要的接口,破坏封装性。如果继承层次很多,代码的复杂度和可读性将难以想象。还有一点就是做单元测试非常困难。
如何组合才能解决这个问题?
组合优势
组合,顾名思义就是让另外一个对象成为当前对象的一部分,成为我的一部分。也能很好的实现代码复用。语义上就是has-a,我有xxx能力,我有xxx功能。
那么让我们看看如何使用多种方法组合来实现上述示例。
public interface Eatable {
void eat();
}
public interface Flyable {
void fly();
}
public class EatAbility implements Eatable {
@Override
public void eat() {
System.out.println("I can eat");
}
} // 省
public class FlyAbility implements Flyable {
@Override
public void fly() {
System.out.println("I can fly");
}
} // 省
组合鸵鸟
public class Ostrich implements Eatable {// 鸵鸟
private Eatable eatable = new EatAbility(); // 组合
//... 省略其他属性和方法...
@Override
public void eat() {
eatable.eat(); // 委托
}
}
你看,对于鸵鸟子类来说问鼎娱乐,只暴露了它的吃东西的能力,而苍蝇接口并没有暴露出来。
理论上我们完全可以通过组合、接口、委托这三种技术手段来替代继承,在项目中不用或少用继承关系,特别是一些复杂的继承关系。
继承真的没用吗?
面向对象编程既然有继承,那说明它并不是完全没用的。
如果类之间的继承结构比较稳定(不会轻易改变),继承层次比较浅(比如最多只有两层继承),继承关系也不复杂,就可以大胆使用继承。反之问鼎娱乐官网下载,系统越不稳定,继承层次越深,继承关系复杂,就应该尽量使用组合,而不要使用继承。
另外,还有一些设计模式使用继承或者组合,比如装饰器模式、策略模式、组合模式等都是使用组合,而模板模式则使用继承。
总结
你在项目中是否经常使用继承?其实 JDK 中有很多地方违背了这个原则。比如 Stack 类不是 Vector,不应该有继承关系,但它却继承自 Vector。无论如何,在项目中决定使用继承而不是组合之前,一定要考虑子类是否真的是父类的子类型?父类是否有可能在将来频繁更改?父类的某些 API 是否存在缺陷?如果有,这些缺陷会不会蔓延到子类中?
客户评论
-
2024-08-12 00:18:18 留言:我回帖楼主给加积分吗?http://9hbx.yyqdaj.com
-
2024-08-12 00:30:42 留言:楼主是我最崇拜的人!http://07bdhb.social-worker.cn
-
2024-08-12 00:37:15 留言:我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://gjzjp.elg8.com
-
2024-08-12 00:51:03 留言:收藏了,以后可能会用到!http://nn0.chudai.net
-
2024-08-12 00:54:10 留言:刚分手,心情不好!http://562l.hanova.com.cn
-
2024-08-12 00:56:45 留言:好帖子!http://ti04.njebo.net
-
2024-08-12 01:11:12 留言:看了这么多帖子,第一次看到这么高质量内容!http://v6uc4z.hardknox.cn
-
2024-08-12 01:15:47 留言:楼主最近很消极啊!http://72pz2a.matetrip.net
-
2024-08-12 01:39:12 留言:顶一个!http://a4me.s-land.cn
-
2024-08-12 01:45:41 留言:我对楼主的敬仰犹如滔滔江水绵延不绝!http://6uz.ahqsl.com
-
2024-08-12 01:53:11 留言:灌水不是我的目的!http://03oil.2hgk.com
-
2024-08-12 01:56:49 留言:支持一下!http://hg4v.lsuuqos.cn
-
2024-08-12 02:10:31 留言:赞一个!http://ifco3.ah-olymmail.com
-
2024-08-12 02:12:03 留言:太高深了,理解力不够用了!http://j8e.zwtsyyx.cn
-
2024-08-12 02:12:51 留言:以后要跟楼主好好学习学习!http://h8zud9.pco9.com
-
2024-08-12 02:23:20 留言:文章写太挺好了,真的值得推荐http://polj6.cndongdang.cn
-
2024-08-12 02:23:57 留言:这么版块的帖子越来越有深度了!http://ejge3.sythjj.com
-
2024-08-12 02:24:06 留言:楼主的帖子实在是写得太好了。文笔流畅,修辞得体!http://bv4z9g.sz-zccs.com
-
2024-08-12 02:38:57 留言:在哪里跌倒,就在那里多爬一会儿!http://www.dnf70.com/2570.html
-
2024-08-12 02:41:15 留言:看了这么多帖子,第一次看到这么有深度了!http://o7ib.cdfha.com
-
2024-08-12 02:44:27 留言:怪事年年有,今年特别多!http://40y0.jiahuamk.com
-
2024-08-12 02:59:21 留言:这一年啥事没干,光研究楼主的帖子了!http://k82d6m.szxxtzm.com
-
2024-08-12 03:00:34 留言:每次看到楼主的帖子都有惊吓!http://qdk8j.hardknox.cn
-
2024-08-12 03:18:01 留言:看帖、回帖、拿分、走人http://dsob39.manniush.com
-
2024-08-12 03:18:10 留言:楼主很有经验啊!http://rx6l.fzr5.com
-
2024-08-12 03:19:38 留言:哥回复的不是帖子,是寂寞!http://f2ldq.xmfeilin.com
-
2024-08-12 03:28:51 留言:看在楼主的面子上,认真回帖!http://vnvc.lnzzsh.org
-
2024-08-12 03:34:31 留言:谢谢楼主的分享!https://cygjczmj.com/software/21362.html
-
2024-08-12 03:52:22 留言:顶顶更健康!http://omxr38.bbnyhq.com
-
2024-08-12 03:53:54 留言:宇宙第一贴诞生了!http://pid6.fb66666.com
-
2024-08-12 04:03:36 留言:楼主很有艺术范!http://www.jiagu1.com/fei/uy48fw6zh/
-
2024-08-12 04:07:27 留言:太邪乎了吧?http://www.jiagu1.com/fei/6z323apel/
-
2024-08-12 04:15:36 留言:每次看到楼主的帖子都有惊吓!http://n4cz.htjtpower.com
-
2024-08-12 04:16:07 留言:很有品味!http://kh70.gdmhvpe.cn
-
2024-08-12 04:23:29 留言:顶顶更健康!http://5nt6v8.hubcezkw.com
-
2024-08-12 04:25:19 留言:语言表达流畅,没有冗余,读起来很舒服。http://e6wd.nnezymc.com
-
2024-08-12 04:33:03 留言:今天上网不回帖,回帖就回精华帖!http://5n5.lf1688.com
-
2024-08-12 04:42:38 留言:楼主加油,看好你哦!http://6bse.smsgnk.com
-
2024-08-12 04:45:43 留言:怪事年年有,今年特别多!http://a18541.7cotton.com
-
2024-08-12 04:50:13 留言:吹牛的人越来越多了!http://huady3.mnpzs.com
-
2024-08-12 05:00:49 留言:一口气看完了,我要下去回味回味了!http://xej.catlz.com
-
2024-08-12 05:06:33 留言:论坛的帖子越来越有深度了!http://sp861l.xzhtjr.com
-
2024-08-12 05:08:15 留言:很经典,收藏了!http://www.jiagu1.com/fei/cz5dardny/
-
2024-08-12 05:17:31 留言:楼主很有经验啊!http://www.jiagu1.com/fei/lymw11p9c/
-
2024-08-12 05:41:17 留言:管它三七二十一!http://www.jiagu1.com/fei/j1kjpp33o/
-
2024-08-12 05:46:57 留言:回帖也有有水平的!http://z0x.bjgjsmtv.com
-
2024-08-12 05:48:11 留言:楼主加油,看好你哦!http://6jr8hs.jf-xny.com
-
2024-08-12 05:58:47 留言:写得实在太好了,我唯一能做的就是默默顶贴!http://t9l.kaidihq.com
-
2024-08-12 06:00:27 留言:楼上的很有激情啊!http://otag.nllth.com
-
2024-08-12 06:07:48 留言:楼主的帖子越来越有深度了!http://1ilo2u.baokuyt.com
-
2024-08-12 06:13:47 留言:楼上的心情不错啊!http://iwto.yuxilife.net
-
2024-08-12 06:16:27 留言:以后就跟楼主混了!http://9u85.nbb9.com
-
2024-08-12 06:16:46 留言:好东西,学习学习!http://5a8.shuotiao.cn
-
2024-08-12 06:17:41 留言:我对楼主的敬仰犹如滔滔江水绵延不绝!http://h1i.8ly8.com
-
2024-08-12 06:18:18 留言:每次看到楼主的帖子都有惊吓!http://slpveq.sygdst.com
-
2024-08-12 06:20:54 留言:有内涵!http://40g83l.zailutu.net
-
2024-08-12 06:25:47 留言:很给力!http://41r.qiangdayiliao.com
-
2024-08-12 06:26:11 留言:我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://xj1e.315-xfzsc.com
-
2024-08-12 06:29:09 留言:以后要跟楼主好好学习学习!http://www.hardknox.cn
-
2024-08-12 06:36:16 留言:怪事年年有,今年特别多!https://smslst.com/sjrj/16419.html
-
2024-08-12 06:42:09 留言:勤奋灌水,天天向上!http://i0w41.sdrzxs.com
-
2024-08-12 06:43:02 留言:楼主发几张靓照啊!http://5zvbo.0200240.com
-
2024-08-12 06:43:22 留言:楼主的帖子越来越有深度了!http://w7q.lubiao.net
-
2024-08-12 06:50:03 留言:被楼主的逻辑打败了!http://zpq.hubcezkw.com
-
2024-08-12 06:59:15 留言:被楼主的逻辑打败了!http://ddhos.jslann.com
-
2024-08-12 07:05:50 留言:最近压力山大啊!http://ibf0.m5yx.com
-
2024-08-12 07:07:01 留言:看在楼主的面子上,认真回帖!http://www.jiagu1.com/fei/mabm79n4r/
-
2024-08-12 07:07:21 留言:宇宙第一贴诞生了!http://fylq.xiongmaokaoyu.com
-
2024-08-12 07:07:50 留言:论坛的人气越来越旺了!http://www.jiagu1.com/fei/mabm79n4r/
-
2024-08-12 07:09:27 留言:以后要跟楼主好好学习学习!http://u9r.023iphone.com
-
2024-08-12 07:10:58 留言:看了这么多帖子,第一次看到这么经典的!http://xh7.zuoanenglish.com.cn
-
2024-08-12 07:22:22 留言:楼主你想太多了!http://3g3t.huishidai.net
-
2024-08-12 07:24:07 留言:楼主人气很旺!http://zxu.sxrele.net
-
2024-08-12 07:28:21 留言:没人理我,好伤心啊!http://1e5b.dgdyxx.cn
-
2024-08-12 07:28:22 留言:看帖不回帖都是耍流氓!http://s9a.hmchwgt.com
-
2024-08-12 07:29:05 留言:我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://www.jiagu1.com/fei/1589dl1ld/
-
2024-08-12 07:30:13 留言:楼主是男的还是女的?http://vfbbdz.qlymj.net
-
2024-08-12 07:30:22 留言:论坛人气好旺!http://uf7w.yiyunzhifu.com
-
2024-08-12 07:40:42 留言:楼主很有激情啊!http://ykli9s.zjlytx.com
-
2024-08-12 07:40:46 留言:这一年啥事没干,光研究楼主的帖子了!http://80p.wan5803.cn
-
2024-08-12 07:51:19 留言:这里的资源非常丰富,帮助我解决了很多问题。https://www.wpsis.com/
-
2024-08-12 07:56:18 留言:鸟大了,什么林子都敢进啊!http://i8w.wucmall.com
-
2024-08-12 08:00:49 留言:信楼主,得永生!http://1su.artygw.com
我要评论