我想使用构造函数初始化派生类中的受保护成员,但由于我调用base(),因此无法调用this(),这会使我的一些调用“闻”:
public class ABase
{
public object Param1 { get; set; }
public object Param2 { get; set; }
protected object Param3 { get; set; }
public ABase()
: this(null, null)
{ }
public ABase(object param1)
: this(param1, null)
{ }
public ABase(object param1, object param2)
{
Param1 = param1;
Param2 = param2;
}
}
public class A : ABase
{
public A()
{ InitParam3(); }
public A(object param1)
: base(param1)
{ InitParam3(); }
public A(object param1, object param2)
: base(param1, param2)
{ InitParam3(); }
private void InitParam3()
{
Param3 = "param3";
}
}
有没有办法避免在每个构造函数中调用InitParam3()
。我愿意完全改变设计方案。
答案 0 :(得分:6)
对子类使用构造函数链,然后调用基类的大多数完整构造函数。
public class ABase
{
public object Param1 { get; set; }
public object Param2 { get; set; }
protected object Param3 { get; set; }
public ABase()
: this(null, null)
{ }
public ABase(object param1)
: this(param1, null)
{ }
public ABase(object param1, object param2)
{
Param1 = param1;
Param2 = param2;
}
}
public class A : ABase
{
public A() : this(null, null)
{ }
public A(object param1)
: this(param1m, null)
{ }
public A(object param1, object param2)
: base(param1, param2)
{ InitParam3(); }
private void InitParam3()
{
Param3 = "param3";
}
}
更新(删除重复的默认值):
public abstract class ABase
{
protected const object DefaultParam1 = null;
protected const object DefaultParam2 = null;
public object Param1 {get;set;}
public object Param2 { get; set; }
protected object Param3 { get; set; }
public ABase(object param1 = DefaultParam1, object param2 = DefaultParam2)
{
Param1 = param1;
Param2 = param2;
}
}
public class A : ABase
{
public A(object param1 = DefaultParam1, object param2 = DefaultParam2)
: base(param1, param2)
{
Param3 = "param3";
}
}
答案 1 :(得分:1)
没有
这是一个很好的解决方案。
lazyberezovsky方法的问题在于派生类对参数的默认值做出了自己的假设,而它必须将它留给超类。
Super-class使用null来启动,如果你决定使用除null之外的其他默认值,你必须改变2个位置。
对我来说,默认值的决定比次要重复更重要。