如何在某些条件下使用不同的基类构造函数?

时间:2012-10-01 01:02:56

标签: c# inheritance

说,我们有两个班级:

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"))
    {
    }
} 

还是有其他方法可以做同样好的甚至更好的方法吗?

2 个答案:

答案 0 :(得分:1)

可以更改所使用的基本构造函数的唯一条件是被调用的实际构造函数 - 找到问题的另一种方法:)

如上所述,工厂方法是一种方法。另外,我相信Ninject(可能还有其他DI框架)允许根据参数 values 动态选择不同的构造函数。可悲的是,我没有足够的DI经验..

在这种情况下,另一种可能性是接收int?,虽然它确实更改了界面,但允许null轻松合并到默认值。

答案 1 :(得分:0)

您是否尝试过在A类构造函数中使用null int(int?)?使用可选参数,您可以使用一个构造函数。