在派生类构造函数中设置基本成员

时间:2014-01-03 20:30:00

标签: c# derived-class

我的设置类似于以下内容:

class A
{
    int commonField1;
    int commonField2;
    int commonField3; 
    // ...

    public A(string[] tokens, string connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus /* ... */)
    {
        // Parses tokens in order to initialize the class members...
    }
}

class B : A
{
    int derivedField;

    public B(string[] differentSetOfTokens, string connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus /* ... */)
    {
        // Parses differentSetOfTokens to initialize fields in class A as well as the fields in class B.
    }
}

基本上,我遇到的问题是在派生类构造函数的主体中,我需要设置在基类中定义的字段。完成我在这里尝试做的最简洁的方法是什么?我可以创建派生类调用的默认基类构造函数,但这显然不是一个好的解决方案。我自己提出的最佳解决方案是在派生类中创建一个静态工厂方法,该方法又调用接受基本字段的新版本的基类构造函数。例如:

class A
{
    int commonField1;
    int commonField2;
    int commonField3; 
    // ...

    public A(string[] tokens, string connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus /* ... */)
    {
        // Parses tokens in order to initialize the class members...
    }

    public A(int commonField1, int commonField2, int commonField3)
    {
        // Set members here...
    }
}

class B : A
{
    int derivedField;

    public B(int commonField1, int commonField2, int commonField3, int derivedField)
        : base(commonField1, commonField2, commonField3)
    {
        this.derivedField = derivedField;
    } 

    static B CreateBFromDifferentSetOfTokens(string[] tokens, string connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus /* ... */)
    {
        // Do parsing work here...

        return new B(commonField1, commonField2, commonField3, derivedField);
    }
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

最干净的正确的方式是将该职责委托给基类的构造函数:

public B(string[] differentSetOfTokens, string connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus /* ... */)
    : base(differentSetOfTokens, connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus)
{
    ...

基本上,您添加:

: base(...)

并将参数传递给基础构造函数,让它处理设置这些字段。然后,在派生类的构造函数中,设置派生类的字段。

请注意,无论您是否愿意,在调用派生类的构造函数时,都将调用基类的构造函数。因此,您要么在基类中有一个无参数构造函数,要么需要将参数传递给基础构造函数。

要通过方法运行派生类的参数,以便在将它们传递给基类之前“修复”它们,在每个参数的派生类中创建单独的静态方法,然后你可以这样做:

: base(ReformatTokens(differentSetOfTokens), ...