类的继承和类的包含都是为了扩展原来的类。(可以参见重构中的Introduce Foreign Method和Introduce Local Extension)
重构中推荐用继承,因为实现起来比较简单。但是有一种情况下必须用包含。下面是一个例子:
现在有一个Date类,我们知道该类的结构,但是却无法改变这个类。
public class Date
{
int y,m,d;
public Date(int _y , Int _m , int _d)
{
y=_y;
m=_m;
d=_d;
}
}
现在我们想在使用 Date类的时候有一个NextDate()的方法,使我们能够获得日期的下一天。以下是用继承的方法扩展的MyDate类:
public class MyDate:Date
{
public MyDate(int y,int m,int d) :base(y,m,d)
{
}
public MyDate NextDate()
{
d = d+1;
return this;
}
}
调用MyDate类的代码如下:
MyDate md = new MyDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
…….
MyDate mdNext = md.NextDate();
对于这段代码,会出错的一种情况是:
执行初始化的时候是2007-7-7,执行完初始化函数但是还没有执行函数NextDate()的时候,当前时间变成了2007-7-8日,但是此时返回的NextDate()仍然是2007-7-8(应该是2007-7-9)
如果将继承改成包含,就不会出现这个问题了。以下是改成包含的代码:
public class MyDate
{
int y,m,d;
Date d;
public MyDate()
{
}
public Date NextDate()
{
Date d = new Date( y+1,m+1,d+1);
return d;
}
}
调用的代码如下:
MyDate md = new MyDate();
…….
md.y=DateTime.Now.Year;
md.m=DateTime.Now.Month;
md.d=DateTime.Now.Day;
Date mdNext = md.NextDate();
另外还可以看到:继承的时候被继承的对象必须在其子类初始化时被初始化。而包含则可以在其他时候再初始化。
转载请注明作者及出处