类的继承和类的包含都是为了扩展原来的类。(可以参见重构中的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();

另外还可以看到:继承的时候被继承的对象必须在其子类初始化时被初始化。而包含则可以在其他时候再初始化

转载请注明作者及出处

posted on 2007-11-07 17:01  今夜太冷  阅读(998)  评论(0)    收藏  举报