My base class Car contains field engine which can not be initialized in base class. I can initialize it in subclass only, for example in ElectricCar i can write engine = new ElectricEngine. However I use field in base class. So I have a field which used but not initialized:
public class Car {
    protected Engine engine;
    public void Start() {
        engine.Start();
        // do something else
    }
    public void Stop {
        engine.Stop();
        // do something else
    }
    public void Diagnose() {
        engine.Diagnose();
        // anotherField.Diagnose();
        // oneAnotherField.Diagnose();
    }
}
How to better initialize engine?
Version 1. Field guaranteed to be initialized but with many fields constructor will look ugly. Bug-free but ugly.
public class Car {
    protected Engine engine;
    public Car(Engine engine) {
        this.engine = engine;
    }
    public void Start() {
        engine.Start();
        // do something else
    }
    public void Stop {
        engine.Stop();
        // do something else
    }
    public void Diagnose() {
        engine.Diagnose();
        // anotherField.Diagnose();
        // oneAnotherField.Diagnose();
    }
}
public class ElectricCar : Car {
    public ElectricCar() : base (new ElectricEngine()) {
    }
}
Version 2. Subclasses should remember to initialize the field, having such "contract" with subclasses may introduce bugs (uninitialized field).
public class Car {
    protected Engine engine;
    public Car() {
    }
    public void Start() {
        engine.Start();
        // do something else
    }
    public void Stop {
        engine.Stop();
        // do something else
    }
    public void Diagnose() {
        engine.Diagnose();
        // anotherField.Diagnose();
        // oneAnotherField.Diagnose();
    }
}
public class ElectricCar : Car  {
    public ElectricCar() {
        engine = new ElectricEngine();
    }
}
Version 3. Field guaranteed to be initialized. Constructor is clear. But calling virtual method from constructor (potentially dangerous, not recommended in general).
public class Car {
    protected Engine engine;
    public Car() {
        InitializeEngine();
    }
    protected abstract void InitializeEngine();
    public void Start() {
        engine.Start();
        // do something else
    }
    public void Stop {
        engine.Stop();
        // do something else
    }
    public void Diagnose() {
        engine.Diagnose();
        // anotherField.Diagnose();
        // oneAnotherField.Diagnose();
    }
}
public class ElectricCar : Car  {
    public ElectricCar() {
    }
    protected void override InitializeEngine() {
        engine = new ElectricEngine();
    }
}
So every version has pros and cons. Which version is better? Or probably you can suggest even something else.