以委托取代继承

简介:

但是由于我个人认为正确、合适地对一些变量进行命名是每位程序员都应该养成的好习惯,适当的命名对我们理解源代码很有帮助的,原作者认为这是最重要、最常用的重构手法,但是我认为这不用再赘述了,原文请点击这里

回归本文主题,以委托取代继承是指我们常常为了一时的便利而错误地在代码中使用到了继承机制。我们知道,继承可以使得子类获得了父类的非私有方法、属性,而我们却正好是看中了这种无形中的便利而不正当地在逻辑上几乎不相关的类之间使用了继承,实质上这种为追求便利的继承是无意义的。具体请看下面的代码。

重构前:

class Sanitation {
	public String washHands() {
		return "Cleaned ...";
	}
}

class Child extends Sanitation {
	
}

 在这里,卫生设备 Sanitation 类(假设为水龙头)具有给人们洗手的方法 washHands() ,但是

这里的 Child 类想要具有 washHands() 的方法,但是完全不可以像上面那样子去 extends 
Sanitation 类啊,这两个类之间完全没有一点支持继承的联系。为了打破我们这种无意义的继承,
以及消除这种带来不良影响的便利,我们应该进行重构,利用委托来实现。
重构第一步,先保留 extends 关系,这样便于一点点地检测我们的重构是否出错,如下:
class Sanitation {
	public String washHands() {
		return "Cleaned ...";
	}
}

// 重构是一小步一小步进行的,先保留 extends 关系
class Child extends Sanitation{
	
	// 具有委托对象 Sanitation 的实例
	private Sanitation sanitation;
	
	public Child() {
		// 为委托对象赋值为当前对象,
		// 因为我们还保留了 extends 关系
		this.sanitation = this;
	}
	
	public String washHands() {
		// 这里使用委托获得  washHands() 方法 
		return (this.sanitation.washHands());
	}
}

当我们编译发现没有错误时(这时还不能运行,会发生栈溢出!),立即将上面 Child 类中的
 extends 去掉,并记得将构造函数中的 this 引用改成真正的创建一个 Sanitation 对象。
重构第二步:
class Child {
	
	// 具有委托对象 Sanitation 的实例
	private Sanitation sanitation;
	
	public Child() {
		// 删除 extends 关系
		this.sanitation = new Sanitation();
	}
	
	public String washHands() {
		// 这里使用委托获得  washHands() 方法 
		return (this.sanitation.washHands());
	}
}

至此,重构成功了!这才可以运行测试了。
小结:用委托取代这种“莫名其妙”的继承关系,是比较符合逻辑的。像 Child 和 Sanitation 两个类,根本就不是一个继承树上的,原先代码结构表现出来的也是毫无意义的。此外,个人认为,《重构》这本书上对于每个重构的步骤讲得比较详细,但是《31天重构》这本书的这一篇文章中的这个例子比《重构》中的似乎更合理些,因为这里的代码是用了一个逻辑上没有继承关系的例子,就想上文。具体的请参考两本书吧。


本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/347127,如需转载请自行联系原作者
相关文章
|
Java C++
面对对象三大特性:封装、继承、多态
面对对象三大特性:封装、继承、多态
|
存储 Java C#
【c#入门杂选】重载,继承,委托
【c#入门杂选】重载,继承,委托
102 0
|
设计模式 前端开发 C#
C#开发中使用委托的作用和好处
先看概念,什么是委托? 从程序的角度来讲:你就可以把委托看成是用来执行方法(函数)的一个“指针” 通俗的说就是:通过委托,我们可以把方法当成参数传递。 这里我举个例子:“设想,如果我们写了一个厨师做菜的方法,里面有拿菜、切菜、配菜、炒菜四个步骤,但编写此方法代码的人想让配菜这个环节让调用方法的人来实现,换句话说,就是想把方法作为参数来传递,那么怎么来实现呢? 方法1:使用接口,这里不是我们讨论的。
7480 0
C#编程:如何理解委托-2
C#编程:如何理解委托-2
103 0
C#编程:如何理解委托
C#编程:如何理解委托
179 0