理解:根本没有父子关系的类中使用继承是不合理的,可以用委派的方式来代替。

详解:我们经常在错误的场景使用继承。继承应该在仅仅有逻辑关系的环境中使用,而很多情况下却被使用在达到方便为目的的环境中。

看下面的代码场景:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _31DaysRefactor
{ public class Sanitation
{
public string WashHands()
{
return "Cleaned!";
} } public class Child : Sanitation
{ }
}

在这个例子中,Child并不是一个Sanitation,两者没有直接的逻辑关系。孩子--公共设施,没有关系,因此使用继承关系并不合适。我们重构代码,使得Child类在构造函数时实例化一个Sanitation对象,委托Sanitation对象调用Sanitation对象的方法,而避免使用继承。如果使用依赖注入,可以通过构造函数注入的方式将Sanitation对象传递给Child。

构造后的code:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _31DaysRefactor
{ public class Sanitation
{
public string WashHands()
{
return "Cleaned!";
} } public class Child
{
private Sanitation sanitation { get; set; } public Child()
{
sanitation = new Sanitation();
} public string WashHands()
{
return sanitation.WashHands();
}
} }

重构第8天:使用委托代替继承(Replace Inheritance with Delegation)的更多相关文章

  1. 封装,capsulation,&&继承,Inheritance,&&多态,polymorphism

    Inheritance&&polymorphism 层次概念是计算机的重要概念.通过继承(inheritance)的机制可对类(class)分层,提供类型/子类型的关系.C++通过类派 ...

  2. Java基础-面向对象第二特征之继承(Inheritance)

    Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...

  3. Python面向对象三要素-继承(Inheritance)

    Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...

  4. 15. AutoMapper 之映射继承(Mapping Inheritance)

    https://www.jianshu.com/p/e4f05403bd13 映射继承(Mapping Inheritance) 映射继承有两个功能: 从基类或接口配置继承映射配置 运行时多态映射 继 ...

  5. 重构8-Replace Inheritance with Delegation(委托替换继承)

    继承的误用十分普遍.它只能用于逻辑环境,但却经常用于简化,这导致复杂的没有意义的继承层次.看下面的代码: public class Sanitation{ public String WashHand ...

  6. 委托 delegate, 继承

    c# 的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了嘛.对不对!怎么录嘛! 一个函数,如果它的参数是函数,那么是这样子写的 public void method( ...

  7. C++面向对象编程之复合、委托和继承

    1.复合,表示has a template <typename T> calss A{ protected: B<T> c; } 这里表示 A 里面有一个 B,A 可以调用 B ...

  8. 组合(composition)与继承(inheritance)

    c++中一个重要的特点就是代码的重用,为了代码重用,有两个非常重要的手段,一个是继承,一个是组合 上面两种类的关系就分别是继承和组合.下面我们看一下代码示例: #ifndef USEFUL_H #de ...

  9. 《Swift Programming Language 》——Swift中怎样使用继承(Inheritance)

    一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性.当一个类继承其他类时,继承类叫子类(subclass),被继承类叫超类(或父类,supercla ...

随机推荐

  1. activemq安装与简单消息发送接收实例

    安装环境:Activemq5.11.1, jdk1.7(activemq5.11.1版本需要jdk升级到1.7),虚拟机: 192.168.147.131 [root@localhost softwa ...

  2. LR6 碱性电池才能带动微软鼠标

    LR6 碱性电池才能带动微软鼠标   好前一段买个一个微软无线鼠标后来动弹不得,更换电池也不行,本来lp说为什么不扔掉,但因为实在做得很漂亮一直带在身边.改用雷柏的普通无线鼠标后也很是好用.不过要经常 ...

  3. Openwrt安装软件的方法

    转自:http://blog.csdn.net/jk110333/article/details/8753825     web软件: Naken Web Openwrt安装软件 简介 Openwrt ...

  4. EF: Returns multi table from procedure

    原文:https://msdn.microsoft.com/en-us/data/jj691402.aspx

  5. CvMat 矩阵的使用方法和简单程序

    一:CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type,void* data=NULL, int step=CV_AUTO ...

  6. GitHub使用简单记录

    根据<GotGitHub>[1]所做的一些整理 1. 浏览托管项目 在GitHub的页面中可以使用键盘快捷键 (1)按下问号(?)会在弹出窗口显示当前页面可用的快捷键. (2)在项目的代码 ...

  7. [转载]在 JavaScript 中判断“空值”

    http://lync.in/check-empty-value-in-javascript/ 有时候我们会遇到这样的情况:在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为 ...

  8. RestTemplate 使用总结

    场景: 认证服务器需要有个 http client 把前端发来的请求转发到 backend service, 然后把 backend service 的结果再返回给前端,服务器本身只做认证功能. 遇到 ...

  9. ux.plugin.ConTpl 模版元素监听扩展

    /* *tpl模版加入按钮 *<div class="x-button-normal x-button x-iconalign-center x-layout-box-item x-s ...

  10. VMware三个版本workstation、server、esxi的区别

    VMware三个版本 workstation: 单机级,用在个人桌面系统中,需要操作系统支持 servier:工作组级,用于服务器,需要操作系统支持 esxi:企业级,用于服务器,不需要操作系统支持 ...