子クラスが有効な状態にない可能性があるため、基本クラスのコンストラクターから仮想メソッドを呼び出すことは危険な場合があることを知っています。(少なくとも C# では)
私の質問は、仮想メソッドがオブジェクトの状態を初期化するものである場合はどうなりますか? 最初にオブジェクトを作成してから状態をロードするのは良い習慣ですか、それとも2段階のプロセスであるべきですか?
最初のオプション: (コンストラクターを使用して状態を初期化する)
public class BaseObject {
public BaseObject(XElement definition) {
this.LoadState(definition);
}
protected abstract LoadState(XElement definition);
}
2 番目のオプション: (2 段階のプロセスを使用)
public class BaseObject {
public void LoadState(XElement definition) {
this.LoadStateCore(definition);
}
protected abstract LoadStateCore(XElement definition);
}
最初のメソッドでは、コードのコンシューマは 1 つのステートメントでオブジェクトを作成および初期化できます。
// The base class will call the virtual method to load the state.
ChildObject o = new ChildObject(definition)
2 番目の方法では、コンシューマーはオブジェクトを作成してから状態をロードする必要があります。
ChildObject o = new ChildObject();
o.LoadState(definition);