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

按传统说法,这就意味继承体系设计错误。你需要为这个subclass 新建一个兄弟(sibling class),再运用Push Down Method(函数下移) 和 Push Down Field (值域下移)把所有用不到的函数下推给那兄弟。这样一来superclass就只持有所有subclasses共享的东西。常常你会听到这样的建议:所有superclasses都应该是抽象的(abstract)。

既然使用「传统说法」这个略带贬义的词,你就可以猜到,我们不建议你这么做,起码不建议你每次都这么做。我们经常利用subclassing手法来复用一些行为,并发现这可以很好地应用于日常工作。这也是一种坏味道,我们不否认,但气味通常并不强烈。所以我们说:如果Refused Bequest引起困惑和问题,请遵循传统忠告。但不必认为你每次都得那么做。十有八九这种坏味道很淡,不值得理睬。

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

代码的坏味道之二十一 :Refused Bequest(被拒绝的遗贈)相关推荐

  1. 重构-改善既有的代码设计-------代码的坏味道

    重构-改善既有的代码设计 代码的坏味道 神秘命名(Mysterious Name) 给函数.变量.模块和类命名时,要使它能清晰地表明自己的功能和用法,使得写下的代码直观明了. 常用重构手法为重命名,包 ...

  2. 代码的坏味道与重构技术

    一.前言 本文大部分内容.图片来自Martin Flower的<Refactoring>一书以及refactoringguru网站(一个很棒的网站),之前在博客发表过,这次属于整理后重新发 ...

  3. Bad Smell (代码的坏味道)

    Bad Smell (代码的坏味道) 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹. 正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 "代码异 ...

  4. 读书笔记之《重构》第三章—代码的坏味道

    第三章 代码的坏味道 这一章告诉我们,什么样的代码需要去重构,该用什么方法.寻找代码的坏味道,就是从代码中找出特定的结构,这些结构指出重构的可能性.寻找这些结构,需要学会判断,判断一个类里面有多少实例 ...

  5. 重构系列之重构的标志:《重构》代码的坏味道

    重复代码 1. 表现:同一个类的两个函数含有相同的表达式. 方案:提炼函数. 2. 表现:两个互为兄弟的子类内含有相同表达式. 方案:函数上移,推入超类. 3. 表现:如果两个毫不相关的类出现重复代码 ...

  6. 重构——代码的坏味道

    1. Duplicated Code(重复的代码)   臭味行列中首当其冲的就是Duplicated Code.如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更 ...

  7. 21 种代码的坏味道

    1.Duplicated Code(重复的代码) 臭味行列中首当其冲的就是Duplicated Code.如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好. ...

  8. 《重构 改善既有代码的设计》之代码的坏味道

    1 简介 知道"如何"不代表知道"何时".决定何时重构.何时停止和知道重构机制如何运转一样重要. 从我们的经验来看,没有任何量度规矩比得上一个见识广博者的直觉. ...

  9. 代码重构/坏味道详解

    推荐本书<重构 改善既有代码的设计> 建议购买正版图书 电子版:http://download.csdn.net/download/sunny_ran/10139470 1.Duplica ...

  10. 22种代码的坏味道,一句话概括

    22种代码的坏味道,一句话概括: 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹. 正如食物要腐坏之前,经常会发出一些异味一样. 我们管这些痕迹叫做"代码异味&q ...

最新文章

  1. Android一个完整的项目转成SDK提供给第三方嵌入
  2. studio-引入外来包
  3. 不同域名cookie共享_cookie在二级域名间共享完成sso
  4. 从零开始入门 K8s | 理解容器运行时接口 CRI
  5. python中的self描述符__set__和__get__简单总结
  6. mysql optimizer_mysql 参数optimizer_switch
  7. spanner 的前世今生
  8. 实现机器学习的循序渐进指南系列汇总
  9. Requests API
  10. Linux学习总结(78)—— 常见开源协议讲解
  11. 数据结构回文数c语言,数据结构算法(字符串转整数和回文数)
  12. protocol buffer安装及使用(非常详细)
  13. 用户增长:APP推广的五大方法
  14. mvvm oc 框架_IOS开发入门之MVVM框架思想
  15. mysql数据库原理设计与应用在线pdf_《数据库原理与应用》[51MB]PDF完整版下载-码农之家...
  16. 老飞飞魅力飞飞关于攻击辅助研究带易语言源码视频教程
  17. 第十七届全国大学生智能汽车竞赛讯飞-家庭服务机器人挑战赛全国总决赛规则
  18. 28BYJ-48步进电机
  19. 班章管家理财入门基础常识有什么?理财产品怎样买最合适
  20. 三次计算机病毒爆发,小心你的计算机中招 未来一周将有3次计算机病毒入侵

热门文章

  1. html之使用session进行服务器之间的跳转以及记录
  2. 湘乡江南计算机学校舒俊梅,东山学校建校120周年校庆捐款捐物情况公布-湘乡东山学校.DOC...
  3. opencv读取颜色通道
  4. 关于Docker时的权限问题解决dial unix /var/run/docker.sock: connect: `permission denied`
  5. Office Professional Plus 2010 产品密钥
  6. 2.7 SLD参考标准与GeoServer扩展
  7. 1024献礼,全栈工程师进击
  8. 【英语阅读】纽约时报 | “流浪作家”三毛:撒哈拉、爱情和死亡
  9. win7计算机隐藏文件,Win7怎么设置隐藏文件夹和取消隐藏?-win7显示隐藏文件
  10. 计蒜客蓝桥杯模拟赛---青出于蓝而胜于蓝