随笔 - 547  文章 - 213 评论 - 417 阅读 - 107万

类的继承和类的包含都是为了扩展原来的类。(可以参见重构中的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   今夜太冷  阅读(986)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示