假设我们有两个继承层次结构,其核心:
Car -> SportsCar -> SuperCar
Run Code Online (Sandbox Code Playgroud)
和
Engine -> TurboEngine -> FormulaOneEngine
Run Code Online (Sandbox Code Playgroud)
汽车有发动机.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;
}
Run Code Online (Sandbox Code Playgroud)
这解决了问题,但它看起来很丑陋!例如,SuperCar现在有三个成员,它们通常指向同一个实例(如果不这样做则更糟糕!)并且它看起来也没必要.对于4级,5级或更多级别的深层次结构,这看起来非常难看:
SuperCar.Engine
SuperCar.SportsEngine
SuperCar.FormulaOneEngine
Run Code Online (Sandbox Code Playgroud)
理想情况下,所有类型的汽车应该只有一个名为Engine的成员,但它应该是不同的类型,具体取决于汽车:
Car.Engine
SportsCar.Engine //of type TurboEngine
SuperCar.Engine //of type FormulaOneEngine
Run Code Online (Sandbox Code Playgroud)
此外,这应该支持多态,所以我可以
List<Car> x = ...
x.Add(myCar);
x.Add(mySportsCar);
x.Add(mySuperCar);
foreach(Car c in x)
{
x.Engine ...
}
Run Code Online (Sandbox Code Playgroud)
所以使用"新"成员就出局了.我还希望能够直接调用每种引擎类型的特定方法:
class Engine { int Capacity; }
class TurboEngine: Engine { …Run Code Online (Sandbox Code Playgroud)