相関する 2 つの継承階層があるとします。
Car -> SportsCar -> SuperCar
と
Engine -> TurboEngine -> FormulaOneEngine
車にはエンジンがあります。SportsCar には TurboEngine があり、SuperCar には FormulaOneEngine があります。問題は、これを C# で適切に表現する方法です。次のようにするとします。
class Car {
Engine Engine;
int HeadLamps;
}
class SportsCar: Car {
TurboEngine TurboEngine;
int Ailerons;
}
class SuperCar: SportsCar {
FormulaOneEngine FormulaOneEngine;
int FlyingSaucers;
}
これで問題は解決しますが、見栄えが悪くなります。たとえば、SuperCar には現在、通常は同じインスタンスを指す 3 つのメンバーがあり (そうでない場合はさらに悪いことです!)、不要に見えます。4、5、またはそれ以上のレベルの深い階層では、これは非常に見苦しくなります:
SuperCar.Engine
SuperCar.SportsEngine
SuperCar.FormulaOneEngine
理想的には、すべてのタイプの Car に Engine と呼ばれる 1 つのメンバーのみを含める必要がありますが、車に応じて異なるタイプにする必要があります。
Car.Engine
SportsCar.Engine //of type TurboEngine
SuperCar.Engine //of type FormulaOneEngine
また、これはポリモーフィズムをサポートする必要があるため、作成できます
List<Car> x = ...
x.Add(myCar);
x.Add(mySportsCar);
x.Add(mySuperCar);
foreach(Car c in x)
{
x.Engine ...
}
したがって、「新しい」メンバーを使用することはできません。また、エンジンの種類ごとに特定のメソッドを直接呼び出せるようにしたいと考えています。
class Engine { int Capacity; }
class TurboEngine: Engine { int TurboCharger; }
class FormulaOneEngine: TurboEngine { int JetFuel; }
myCar.Engine.Capacity = ....
mySportsCar.Engine.TurboCharger = ...
mySuperCar.Engine.JetFuel = ...
また、通常の継承グッズを使用できるようになります。
myCar.HeadLamps = ...
mySportsCar.HeadLamps = ....
mySportsCar.Ailerons = ....
mySuperCar.HeadLamps = ...
mySuperCar.Ailerons = ....
mySuperCar.FlyingSaucers = ....
これをリファクタリングして目的を果たし、見栄えを良くする方法はありますか? 実際のコードでは、4、5、またはそれ以上のレベルの継承チェーンを使用する場合があります。私は明らかな何かを見逃していますか、それともトリックですか?