在基类构造函数中调用虚拟方法
2022-09-01 09:29:26
						我知道从基类构造函数调用虚拟方法可能是危险的,因为子类可能不处于有效状态。(至少在 C# 中)
我的问题是,如果虚拟方法是初始化对象状态的方法,该怎么办?这是好的做法还是应该是一个两步过程,首先创建对象,然后加载状态?
第一个选项:(使用构造函数初始化状态)
public class BaseObject {
    public BaseObject(XElement definition) {
        this.LoadState(definition);
    }
    protected abstract LoadState(XElement definition);
}
第二个选项:(使用两步流程)
public class BaseObject {
    public void LoadState(XElement definition) {
        this.LoadStateCore(definition);
    }
    protected abstract LoadStateCore(XElement definition);
}
在第一种方法中,代码的使用者可以使用一个语句创建和初始化对象:
// The base class will call the virtual method to load the state.
ChildObject o = new ChildObject(definition)
在第二种方法中,使用者必须创建对象,然后加载状态:
ChildObject o = new ChildObject();
o.LoadState(definition);