Я знаю, что вызов виртуального метода из конструктора базового класса может быть опасным, поскольку дочерний класс может не находиться в допустимом состоянии. (по крайней мере, на С#)
Мой вопрос: что, если виртуальным методом является тот, кто инициализирует состояние объекта? Это хорошая практика или это должен быть двухэтапный процесс, сначала создать объект, а затем загрузить состояние?
Первая опция: (используя конструктор для инициализации состояния)
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);