假设我们有两个类:
public class A
{
protected static readonly int DefaultValue = 123;
int value;
public A()
{
value = DefaultValue;
}
public A(int _value)
{
value = _value;
}
}
public class B : A
{
public B(XElement x)
: base(x.Element("int") == null
? A.DefaultValue
: (int)x.Element("int"))
{
}
}
我知道我可以为 B 类创建一个无参数构造函数::
public B():base()
{
}
并且有这样的东西:
B objB = (x.Element("int") == null)?new B():new B((int)x.Element("int"));
但我希望将此逻辑封装在 B 类中。
此外,我发现我可以执行某种静态工厂方法并将其封装(如果需要,甚至可以将这些 B 类构造函数设为 private
):
public static B GetInstance(XElement x)
{
return (x.Element("int") == null)?new B():new B((int)x.Element("int"));
}
但我希望能够拥有像下面的伪代码这样的东西:
public class A
{
//don't need this anymore
//protected static readonly int DefaultValue = 123;
int value;
public A()
{
value = 123;
}
public A(int _value)
{
value = _value;
}
}
public class B : A
{
public B(XElement x)
: x.Element("int") == null
? base()
: base((int)x.Element("int"))
{
}
}
或者有没有其他方法可以做同样的事情,甚至更好?
最佳答案
可以更改所使用的基本构造函数的唯一条件是调用的实际构造函数 - 找到解决问题的另一种方法:)
如前所述,工厂方法是一种方法。另外,我相信Ninject (可能还有其他 DI 框架)允许根据参数值动态选择不同的构造函数。遗憾的是,我没有足够的 DI 经验..
这种情况下的另一种可能性是采用 int?
,虽然它确实改变了接口(interface),但允许 null
轻松合并为默认值。
关于c# - 如何在某些情况下使用不同的基类构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666460/