Рассмотрим код в следующем примере:Обойти виртуального вызова в конструкторе
abstract class Car
{
public abstract Engine CarEngine { get; protected set; }
public Car()
{
CarEngine.EngineOverheating += new EventHandler(CarEngine_EngineOverheating);
}
void CarEngine_EngineOverheating(object sender, EventArgs e)
{
// Subscribing to the event of all engines
}
}
sealed class Toyota : Car
{
public Toyota()
{
this.CarEngine = new ToyotaEngine();
}
public override Engine CarEngine { get; protected set; }
}
abstract class Engine
{
public event EventHandler EngineOverheating;
}
class ToyotaEngine : Engine
{
}
Этот код, как и ожидалось, не работает, поскольку CarEngine еще не был инициализирован. Каковы мои варианты решения такого случая?
Несколько вариантов, которые я вижу их минусы:
- Подписаться на каждом дочернем классе вручную - результаты с большим количеством кода котла пластины и, как следствие, к ошибкам.
- Функция Initialize() - непринужденная и избыточная.
Я был бы рад увидеть больше идей.
Спасибо!
Спасибо. Я пойду с этим :) – VitalyB