1)如果我在基类中定义一个字段,如
myType myField = new MyField();
此字段是否始终在派生类中初始化?
2)如果我通过基类默认(无参数)构造函数初始化此字段,它是否会在派生类中初始化?
假设我没有从派生类型调用任何:base()
构造函数。
我的观点是仅在基类中实例化具有默认值的字段,并在派生类中提供重写初始化。
答案 0 :(得分:1)
是的,字段将始终初始化。如果您没有明确地链接到任何其他构造函数,那么您将隐式链接到base()
。在点击Object
之前,您总是会在类型层次结构中进行链接。
我的观点是仅在基类中使用默认值实例化属性,并在派生类中提供重写初始化。
然后我建议在基类中,你有两个构造函数,其中一个可能受到保护:
public class BaseClass
{
private MyType myField;
protected BaseClass(MyType myField)
{
this.myField = myField;
}
public BaseClass() : this(new MyType())
{
}
}
然后,派生类型的构造函数可以根据需要链接到任一构造函数......并且当您不需要时,最终不会创建MyType
的实例。