如何避免使用多个构造函数重复代码
本文关键字:构造函数 代码 何避免 | 更新日期: 2023-09-27 18:13:49
我需要多个类构造器的帮助。我不想重复我的代码,但如何?
public EventModel(string name, DateTime startTime, DateTime endTime)
: base(name)
{
StartTime = startTime;
EndTime = endTime;
}
public EventModel(Guid id, string name, DateTime startTime, DateTime endTime)
: base(id, name)
{
StartTime = startTime;
EndTime = endTime;
}
我看起来像这样:
public EventModel(Guid id, string name, DateTime startTime, DateTime endTime)
: this(name, startTime, endTime), base(id, name)
{
}
通常在这种情况下,我会将代码重构为一个通用的方法,这样做的缺点是您不能设置readonly
字段。
public EventModel(string name, DateTime startTime, DateTime endTime)
: base(name)
{
Initialize(startTime, endTime);
}
public EventModel(Guid id, string name, DateTime startTime, DateTime endTime)
: base(id, name)
{
Initialize(startTime, endTime);
}
private void Initialize(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
}
如果您可以修改基类以接受可为空的Guid
,则可以使id
参数为可选:
public EventModel(
string name,
DateTime startTime,
DateTime endTime,
Guid? id = null)
: base(name, id)
{
StartTime = startTime;
EndTime = endTime;
}
然后在基类中,将空id
视为仅接受name
的构造函数。这样做可能会防止您避免基类中的重复,但同时您可能能够减少基类中的重复。
另外,我强烈建议您将Guid
类型参数称为guid
。缩短为id
几乎没有任何好处,而且更有可能使稍后查看代码的人感到困惑并减慢速度。
让基类像这样实现。下面是一个例子
基类public Text(): this(0, 0, null) {}
public Text(int x, int y): this(x, y, null) {}
public Text(int x, int y, string s) {
// Actual constructor implementation
样本使用Text t1 = new Text(); // Same as Text(0, 0, null)
Text t2 = new Text(5, 10); // Same as Text(5, 10, null)
Text t3 = new Text(5, 20, "Hello");
为构造函数提供默认值。
public EventModel(Guid id = default(Guid), string name = "Default", DateTime startTime = new DateTime(0), DateTime endTime = new DateTime(0))
: base(id, name)
{
StartTime = startTime;
EndTime = endTime;
}