[21] Refused Bequest(被拒绝的遗赠)

子类应该继承超类的函数和数据. 但如果它们不想或不需要继承, 又该怎么办呢? 它们得到所有礼物, 却只从中挑选几样来玩.

按传统说法, 这就意味着继承体系设计错误. 你需要为整个子类新建一个兄弟类, 在运用Push Down Method(函数下移)Push Down Field(下移字段) 把所有用不到的函数下推给那个兄弟. 这样一来, 超类就只持有所有子类共享的东西了. 你常常听到这样的建议:

所有超类都应该是抽象(abstract)的.

既然使用"传统说法" 这个略带贬义的词, 你就可以猜到, 我们不建议你这么做, 最起码不建议你每次都这么做. 我们经常利用继承来复用一些行为, 并发现这可以很到的应用与日常工作. 这也是一种坏味道, 我们不否认, 但气味通常并不强烈. 所有我们说:

如果Refused Bequest引起困惑和问题,请遵循传统忠告.

但不必认为你每次都得那么做.十有八九这种坏味道很淡, 不值得理财.

如果子类复用了超类的行为(实现), 却又不愿意支持超类的接口, Refused Bequest的坏味道就会变的浓烈. 拒绝继承超类的实现,这一点我们不介意; 但如果拒绝继承超类的接口,我们不以为然. 不过即使你不愿意继承接口, 也不要胡乱修改继承体系, 应该运用Replace Inheritance with Delegation(用代理替代继承) 来达到目的.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《重构》读书笔记 总览 第一部分 第一章从实例程序出发,展示设计的缺陷,对其重构可以了解重构的过程和方法。 第二部...
    白桦叶阅读 2,459评论 2 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,650评论 25 709
  • 过去这一周,经历了纠结的填报志愿过程。 孩子在中考时发挥正常,成绩比较理想,分数出来后,就准备填报志愿。 本来是一...
    静下心来阅读阅读 335评论 0 1
  • 我想谦卑地下跪,我应该跪在谁的面前? 我想及门而返,可是那个门在哪儿?
    西行者2011阅读 489评论 0 0
  • 一边冰川覆盖,一边稀草慌慌,万里晴空的晨光之下,玛沁的天地显得格外美景,蓝蓝的天空之下,虽看不到成群结队的牛羊,但...
    多果加阅读 201评论 1 2