0

假设我们有以下类:

class C
{
    private readonly DataType data;
    private readonly AdditionalType additional;

    C(DataType newData)
    {
        data = newData;
        // LONG code evaluating additional
    }

    C(OtherType newData)
    {
        // eval data from newData
        // the same LONG code evaluating additional
    }
}

在 C 的整个生命周期中,两者都data保持不变。但是,有一种代码味道:在两个构造函数中,计算部分都加倍了。然后自然的选择是将其提取到另一种方法:additionaladditional

class C
{
    private readonly DataType data;
    private readonly AdditionalType additional;

    private void EvalAdditional()
    {
        // LONG code evaluating additional
    }

    C(DataType newData)
    {
        data = newData;
        EvalAdditional();
    }

    C(OtherType newData)
    {
        // eval data from newData
        EvalAdditional();
    }
}

但随后附加不再是只读的(因为它没有在 ctor 中初始化)。

如何优雅地解决这个问题?

4

3 回答 3

4

只需让方法EvalAdditional返回additional对象(而不是void)。

readonly DataType data;
readonly AdditionalType additional;

AdditionalType EvalAdditional()
{
    // LONG code evaluating additional
    return additional;
}

C(DataType newData)
{
    data = newData;
    additional = EvalAdditional();
}

C(OtherType newData)
{
    // eval data from newData
    additional = EvalAdditional();
}
于 2013-06-22T12:33:16.187 回答
2

如果 的 评估additional不依赖于给其他构造函数的参数,您可以将其移动到私有构造函数并从您的公共构造函数中调用它:

private C()
{
    //long code evaluating additional
}

C(DataType newData)
    : this()
{
    data = newData;
}
于 2013-06-22T12:35:06.430 回答
0

你可以这样做:

C(DataType newData)
    :this ()
{
    data = newData;
}

C(OtherType newData)
    :this ()
{
    // eval data from newData
}

private C()
{
    EvalAdditional();
}

尽管这在很大程度上取决于 EvalAdditional 正在做什么,但如果需要,您可以传递参数。

于 2013-06-22T12:35:48.027 回答