类的继承和类的包含都是为了扩展原来的类。(可以参见重构中的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();
另外还可以看到:继承的时候被继承的对象必须在其子类初始化时被初始化。而包含则可以在其他时候再初始化。
转载请注明作者及出处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架