オブジェクトの2つの「系統」があります。
Carの基本クラスですSportsCarEngineの基本クラスです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()ます。それで:
- このアプローチで見られない問題はありますか?
- どうやらコンストラクターで仮想メソッドを呼び出すのは悪いことです。私の場合は例外ですか?