假设我们有两个相互关联的继承层次结构:
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 现在有三个成员,它们通常会指向同一个实例(如果他们不这样做会更糟!)而且它看起来也没有必要。如果有 4、5 或更多级别的深度层次结构,这看起来会非常难看:
SuperCar.Engine
SuperCar.SportsEngine
SuperCar.FormulaOneEngine
理想情况下,所有类型的 Car 都应该只有一个成员,称为 Engine,但它应该是不同的类型,具体取决于汽车:
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 甚至更多级别的继承链。我错过了一些明显的东西还是一些技巧?