我的基类Car
包含engine
无法在基类中初始化的字段。我只能在子类中初始化它,例如在ElectricCar
i can writeengine = new ElectricEngine
中。但是我在基类中使用字段。所以我有一个使用但未初始化的字段:
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();
}
}
如何更好地初始化引擎?
版本 1. 字段保证被初始化,但有很多字段构造函数看起来很难看。没有错误但丑陋。
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()) {
}
}
版本 2. 子类应该记住初始化字段,与子类有这样的“合同”可能会引入错误(未初始化的字段)。
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();
}
}
版本 3. 保证初始化字段。构造函数很清楚。但是从构造函数调用虚方法(可能很危险,一般不推荐)。
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();
}
}
所以每个版本都有优缺点。哪个版本更好?或者,您甚至可以提出其他建议。