问鼎娱乐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 是否存在缺陷?如果有,这些缺陷会不会蔓延到子类中?

关键词:

客户评论

  1. 3D560开奖历史前后关系
    2024-08-12 00:18:18 留言:
    我回帖楼主给加积分吗?http://9hbx.yyqdaj.com
  1. 下载东方赢家软件
    2024-08-12 00:30:42 留言:
    楼主是我最崇拜的人!http://07bdhb.social-worker.cn
  1. 2024新澳最新开奖结果查询
    2024-08-12 00:37:15 留言:
    我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://gjzjp.elg8.com
  1. k彩彩民福地登录app老版本
    2024-08-12 00:51:03 留言:
    收藏了,以后可能会用到!http://nn0.chudai.net
  1. 大乐透近100期基本走势结果表
    2024-08-12 00:54:10 留言:
    刚分手,心情不好!http://562l.hanova.com.cn
  1. 3D走势图带连线专业版解析
    2024-08-12 00:56:45 留言:
    好帖子!http://ti04.njebo.net
  1. 游客
    2024-08-12 01:11:12 留言:
    看了这么多帖子,第一次看到这么高质量内容!http://v6uc4z.hardknox.cn
  1. 楼主最近很消极啊!http://72pz2a.matetrip.net
  1. 新版千里马免费计划app
    2024-08-12 01:39:12 留言:
    顶一个!http://a4me.s-land.cn
  1. appstore下载苹果版
    2024-08-12 01:45:41 留言:
    我对楼主的敬仰犹如滔滔江水绵延不绝!http://6uz.ahqsl.com
  1. 168飞艇官方开奖免费计划
    2024-08-12 01:53:11 留言:
    灌水不是我的目的!http://03oil.2hgk.com
  1. 大发手游网站在线玩
    2024-08-12 01:56:49 留言:
    支持一下!http://hg4v.lsuuqos.cn
  1. 赞一个!http://ifco3.ah-olymmail.com
  1. 大乐透摇奖机模拟选号器软件
    2024-08-12 02:12:03 留言:
    太高深了,理解力不够用了!http://j8e.zwtsyyx.cn
  1. 6.17500cn选号大厅
    2024-08-12 02:12:51 留言:
    以后要跟楼主好好学习学习!http://h8zud9.pco9.com
  1. 最新一期的联销图谜
    2024-08-12 02:23:20 留言:
    文章写太挺好了,真的值得推荐http://polj6.cndongdang.cn
  1. 5000块每天赢300
    2024-08-12 02:23:57 留言:
    这么版块的帖子越来越有深度了!http://ejge3.sythjj.com
  1. 半岛·综合体育中国App
    2024-08-12 02:24:06 留言:
    楼主的帖子实在是写得太好了。文笔流畅,修辞得体!http://bv4z9g.sz-zccs.com
  1. 游客
    2024-08-12 02:38:57 留言:
    在哪里跌倒,就在那里多爬一会儿!http://www.dnf70.com/2570.html
  1. 大发软件官网下载
    2024-08-12 02:41:15 留言:
    看了这么多帖子,第一次看到这么有深度了!http://o7ib.cdfha.com
  1. 河内五分彩是官方彩种吗
    2024-08-12 02:44:27 留言:
    怪事年年有,今年特别多!http://40y0.jiahuamk.com
  1. 3d准确定跨度的绝招
    2024-08-12 02:59:21 留言:
    这一年啥事没干,光研究楼主的帖子了!http://k82d6m.szxxtzm.com
  1. 游客
    2024-08-12 03:00:34 留言:
    每次看到楼主的帖子都有惊吓!http://qdk8j.hardknox.cn
  1. 大发平台app下载官网苹果
    2024-08-12 03:18:01 留言:
    看帖、回帖、拿分、走人http://dsob39.manniush.com
  1. 历届世界杯四强比分表
    2024-08-12 03:18:10 留言:
    楼主很有经验啊!http://rx6l.fzr5.com
  1. 普通牌斗牛最新高科技
    2024-08-12 03:19:38 留言:
    哥回复的不是帖子,是寂寞!http://f2ldq.xmfeilin.com
  1. 会员料公开验证默认版块
    2024-08-12 03:28:51 留言:
    看在楼主的面子上,认真回帖!http://vnvc.lnzzsh.org
  1. TG@feimiseo
    2024-08-12 03:34:31 留言:
    谢谢楼主的分享!https://cygjczmj.com/software/21362.html
  1. 三中三澳门免费资料网站
    2024-08-12 03:52:22 留言:
    顶顶更健康!http://omxr38.bbnyhq.com
  1. 澳洲幸运5开奖视频直播平台官方
    2024-08-12 03:53:54 留言:
    宇宙第一贴诞生了!http://pid6.fb66666.com
  1. 游客
    2024-08-12 04:03:36 留言:
    楼主很有艺术范!http://www.jiagu1.com/fei/uy48fw6zh/
  1. 游客
    2024-08-12 04:07:27 留言:
    太邪乎了吧?http://www.jiagu1.com/fei/6z323apel/
  1. 微彩app最新版本更新内容
    2024-08-12 04:15:36 留言:
    每次看到楼主的帖子都有惊吓!http://n4cz.htjtpower.com
  1. 一分大发快三稳赚规律
    2024-08-12 04:16:07 留言:
    很有品味!http://kh70.gdmhvpe.cn
  1. 澳门码资料版本大全
    2024-08-12 04:23:29 留言:
    顶顶更健康!http://5nt6v8.hubcezkw.com
  1. 北京p10赛车官网
    2024-08-12 04:25:19 留言:
    语言表达流畅,没有冗余,读起来很舒服。http://e6wd.nnezymc.com
  1. 云彩店邀请码54544
    2024-08-12 04:33:03 留言:
    今天上网不回帖,回帖就回精华帖!http://5n5.lf1688.com
  1. 跨度合值7
    2024-08-12 04:42:38 留言:
    楼主加油,看好你哦!http://6bse.smsgnk.com
  1. 必发指数app推荐
    2024-08-12 04:45:43 留言:
    怪事年年有,今年特别多!http://a18541.7cotton.com
  1. 欧洲杯决赛结果
    2024-08-12 04:50:13 留言:
    吹牛的人越来越多了!http://huady3.mnpzs.com
  1. 3d怎么算和值最准确
    2024-08-12 05:00:49 留言:
    一口气看完了,我要下去回味回味了!http://xej.catlz.com
  1. 3d走势图乐彩网17500
    2024-08-12 05:06:33 留言:
    论坛的帖子越来越有深度了!http://sp861l.xzhtjr.com
  1. 游客
    2024-08-12 05:08:15 留言:
    很经典,收藏了!http://www.jiagu1.com/fei/cz5dardny/
  1. 游客
    2024-08-12 05:17:31 留言:
    楼主很有经验啊!http://www.jiagu1.com/fei/lymw11p9c/
  1. 游客
    2024-08-12 05:41:17 留言:
    管它三七二十一!http://www.jiagu1.com/fei/j1kjpp33o/
  1. 49图库港澳资料版
    2024-08-12 05:46:57 留言:
    回帖也有有水平的!http://z0x.bjgjsmtv.com
  1. 0234彩下载官网
    2024-08-12 05:48:11 留言:
    楼主加油,看好你哦!http://6jr8hs.jf-xny.com
  1. 买足球外围安全吗
    2024-08-12 05:58:47 留言:
    写得实在太好了,我唯一能做的就是默默顶贴!http://t9l.kaidihq.com
  1. 广东快乐十分20分钟中奖规则
    2024-08-12 06:00:27 留言:
    楼上的很有激情啊!http://otag.nllth.com
  1. 三D,杀码,定胆
    2024-08-12 06:07:48 留言:
    楼主的帖子越来越有深度了!http://1ilo2u.baokuyt.com
  1. 十四场胜负彩开奖奖金
    2024-08-12 06:13:47 留言:
    楼上的心情不错啊!http://iwto.yuxilife.net
  1. 计划之家软件官网
    2024-08-12 06:16:27 留言:
    以后就跟楼主混了!http://9u85.nbb9.com
  1. 创世红海官网下载2685
    2024-08-12 06:16:46 留言:
    好东西,学习学习!http://5a8.shuotiao.cn
  1. 1990世界杯决赛全场回放
    2024-08-12 06:17:41 留言:
    我对楼主的敬仰犹如滔滔江水绵延不绝!http://h1i.8ly8.com
  1. 650注大底怎么刷比较稳
    2024-08-12 06:18:18 留言:
    每次看到楼主的帖子都有惊吓!http://slpveq.sygdst.com
  1. 兴发mxf187
    2024-08-12 06:20:54 留言:
    有内涵!http://40g83l.zailutu.net
  1. 中国网球吧
    2024-08-12 06:25:47 留言:
    很给力!http://41r.qiangdayiliao.com
  1. 扑克认牌法的原理
    2024-08-12 06:26:11 留言:
    我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://xj1e.315-xfzsc.com
  1. 游客
    2024-08-12 06:29:09 留言:
    以后要跟楼主好好学习学习!http://www.hardknox.cn
  1. TG@feimiseo
    2024-08-12 06:36:16 留言:
    怪事年年有,今年特别多!https://smslst.com/sjrj/16419.html
  1. 香港二四六308kcm图库电脑版
    2024-08-12 06:42:09 留言:
    勤奋灌水,天天向上!http://i0w41.sdrzxs.com
  1. 勤径千里马官网
    2024-08-12 06:43:02 留言:
    楼主发几张靓照啊!http://5zvbo.0200240.com
  1. 亚投娱乐
    2024-08-12 06:43:22 留言:
    楼主的帖子越来越有深度了!http://w7q.lubiao.net
  1. pg电子玩什么最容易赢钱
    2024-08-12 06:50:03 留言:
    被楼主的逻辑打败了!http://zpq.hubcezkw.com
  1. 快乐8十个中7个多少钱能中奖
    2024-08-12 06:59:15 留言:
    被楼主的逻辑打败了!http://ddhos.jslann.com
  1. 大发快三高手计划
    2024-08-12 07:05:50 留言:
    最近压力山大啊!http://ibf0.m5yx.com
  1. 游客
    2024-08-12 07:07:01 留言:
    看在楼主的面子上,认真回帖!http://www.jiagu1.com/fei/mabm79n4r/
  1. 乐彩网app是合法平台吗
    2024-08-12 07:07:21 留言:
    宇宙第一贴诞生了!http://fylq.xiongmaokaoyu.com
  1. 游客
    2024-08-12 07:07:50 留言:
    论坛的人气越来越旺了!http://www.jiagu1.com/fei/mabm79n4r/
  1. 快乐八今日推荐
    2024-08-12 07:09:27 留言:
    以后要跟楼主好好学习学习!http://u9r.023iphone.com
  1. 游客
    2024-08-12 07:10:58 留言:
    看了这么多帖子,第一次看到这么经典的!http://xh7.zuoanenglish.com.cn
  1. 大小单双正规平台大众平台
    2024-08-12 07:22:22 留言:
    楼主你想太多了!http://3g3t.huishidai.net
  1. 快盈500大发
    2024-08-12 07:24:07 留言:
    楼主人气很旺!http://zxu.sxrele.net
  1. 3d杀号走势图定号
    2024-08-12 07:28:21 留言:
    没人理我,好伤心啊!http://1e5b.dgdyxx.cn
  1. 打麻将如何记牌和猜牌
    2024-08-12 07:28:22 留言:
    看帖不回帖都是耍流氓!http://s9a.hmchwgt.com
  1. 游客
    2024-08-12 07:29:05 留言:
    我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://www.jiagu1.com/fei/1589dl1ld/
  1. 168飞艇官方开奖历史记录查询
    2024-08-12 07:30:13 留言:
    楼主是男的还是女的?http://vfbbdz.qlymj.net
  1. 大发快三精准计划人工
    2024-08-12 07:30:22 留言:
    论坛人气好旺!http://uf7w.yiyunzhifu.com
  1. 大发导师经验计划单带赚钱
    2024-08-12 07:40:42 留言:
    楼主很有激情啊!http://ykli9s.zjlytx.com
  1. 105app官方正版官方下载安装
    2024-08-12 07:40:46 留言:
    这一年啥事没干,光研究楼主的帖子了!http://80p.wan5803.cn
  1. telegram官方网站
    2024-08-12 07:51:19 留言:
    这里的资源非常丰富,帮助我解决了很多问题。https://www.wpsis.com/
  1. 开元平台app官网
    2024-08-12 07:56:18 留言:
    鸟大了,什么林子都敢进啊!http://i8w.wucmall.com
  1. 46倍狮子机的漏洞打法
    2024-08-12 08:00:49 留言:
    信楼主,得永生!http://1su.artygw.com

我要评论