オブジェクトの2つの「系統」があります。
Car
の基本クラスですSportsCar
Engine
の基本クラスですSportsEngine
Car
のフィールドの1つはengine
、タイプのEngine
です。SportsCar
これをオーバーライドし、代わりengine
にタイプがのフィールドを持ちますSportsEngine
。
のコンストラクターCar
は次のとおりです。
public Car() {
engine = new Engine();
}
のコンストラクターSportsCar
は次のとおりです。
public SportsCar() : base() {
engine = new SportsEngine();
}
アイデアは、私が車のタイプの階層を持っており、各車が適切な種類のエンジン(車の機能の特定の側面を決定する)を持っているということです。車の階層のあるポイントをサブクラス化すると、この車のエンジンが既存の車と同じ馬力、重量、燃料使用量などであるかどうかを判断し、既存のエンジンを使用してengine
フィールドにデータを入力できます。追加する新しい車に固有のエンジンを搭載する必要があると判断した場合は、Engine
階層をサブクラス化して新しいエンジンを作成し、フィールドをオーバーライドしてengine
、新しい車のコンストラクターを変更して正しく初期化できます。
問題は、C#を正しく理解している場合、新しいインスタンスを作成するとB
、エンジンが2回初期化されることです。厳密に言えば、それは現在の非常に単純なケースを壊すことはありません。しかし、何が起こるかというと、私がnew SportsCar()
それを最初に呼び出すengine = new Engine();
と、engine = new SportsEngine();
。
概念的には、スポーツカーを作るときは、一般的なエンジンを入れずに、すぐに引き出してから、スポーツエンジンを入れます。これは、コードが実行することになると思います。
実際には、最初の結果がとにかく破棄されるときに、なぜ2つのコンストラクター呼び出しを行う必要があるのでしょうか。
私の解決策はvirtual void CreateEngine() { engine = new Engine(); }
、ベースの建設業者に電話をかけ、子供用の車には決して電話をかけないことでした。次に、各車は独自のを実装しoverride void CreateEngine()
ます。それで:
- このアプローチで見られない問題はありますか?
- どうやらコンストラクターで仮想メソッドを呼び出すのは悪いことです。私の場合は例外ですか?