1

说,我们有两个类:

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 类中。

我还看到我可以做某种静态工厂方法并将其封装(private如果需要,甚至可以制作那些 B 类构造函数):

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

或者有没有其他方法可以做同样的事情,甚至更好?

4

2 回答 2

1

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

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

在这种情况下,另一种可能性是采用int?它,虽然它确实改变了接口,但null可以很容易地合并到默认值。

于 2012-10-01T01:07:54.547 回答
0

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

于 2012-10-01T10:42:32.917 回答