我的设置类似于以下内容:
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);
}
}
有更好的方法吗?
答案 0 :(得分:2)
最干净的和正确的方式是将该职责委托给基类的构造函数:
public B(string[] differentSetOfTokens, string connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus /* ... */)
: base(differentSetOfTokens, connectionID, ContractIDMap contractIDMap, OrderStatus currentStatus)
{
...
基本上,您添加:
: base(...)
并将参数传递给基础构造函数,让它处理设置这些字段。然后,在派生类的构造函数中,设置派生类的字段。
请注意,无论您是否愿意,在调用派生类的构造函数时,都将调用基类的构造函数。因此,您要么在基类中有一个无参数构造函数,要么需要将参数传递给基础构造函数。
要通过方法运行派生类的参数,以便在将它们传递给基类之前“修复”它们,在每个参数的派生类中创建单独的静态方法,然后你可以这样做:
: base(ReformatTokens(differentSetOfTokens), ...