派生 class 中的基础 class 字段初始化
Base class field initialization in derived class
1) 如果我在基础class中定义一个字段,比如
myType myField = new MyField();
这个字段是否总是在派生的 class 中初始化?
2) 如果我通过基础 class 默认(无参数)构造函数初始化此字段,它会在派生的 class 中初始化吗?
假设我不从派生类型调用任何 :base()
构造函数。
我的观点是仅在基础 class 中使用默认值实例化字段,并在派生 classes 中提供覆盖初始化。
是的,字段将始终被初始化。如果您没有显式链接到任何其他构造函数,您将隐式链接到 base()
。您将始终在类型层次结构中向上链接,直到您点击 Object
.
My point is to instantiate property with default value only in base class and provide overridden initialization in derived classes.
然后我建议在基础 class 中,你有两个构造函数,其中一个可能是受保护的:
public class BaseClass
{
private MyType myField;
protected BaseClass(MyType myField)
{
this.myField = myField;
}
public BaseClass() : this(new MyType())
{
}
}
然后派生类型的构造函数可以根据需要链接到任一构造函数...并且您不会在不需要时最终创建 MyType
的实例。
1) 如果我在基础class中定义一个字段,比如
myType myField = new MyField();
这个字段是否总是在派生的 class 中初始化?
2) 如果我通过基础 class 默认(无参数)构造函数初始化此字段,它会在派生的 class 中初始化吗?
假设我不从派生类型调用任何 :base()
构造函数。
我的观点是仅在基础 class 中使用默认值实例化字段,并在派生 classes 中提供覆盖初始化。
是的,字段将始终被初始化。如果您没有显式链接到任何其他构造函数,您将隐式链接到 base()
。您将始终在类型层次结构中向上链接,直到您点击 Object
.
My point is to instantiate property with default value only in base class and provide overridden initialization in derived classes.
然后我建议在基础 class 中,你有两个构造函数,其中一个可能是受保护的:
public class BaseClass
{
private MyType myField;
protected BaseClass(MyType myField)
{
this.myField = myField;
}
public BaseClass() : this(new MyType())
{
}
}
然后派生类型的构造函数可以根据需要链接到任一构造函数...并且您不会在不需要时最终创建 MyType
的实例。