次のような継承階層を設定しようとしています。
abstract class Vehicle
{
public string Name;
public List<Axle> Axles;
}
class Motorcycle : Vehicle
{
}
class Car : Vehicle
{
}
abstract class Axle
{
public int Length;
public void Turn(int numTurns) { ... }
}
class MotorcycleAxle : Axle
{
public bool WheelAttached;
}
class CarAxle : Axle
{
public bool LeftWheelAttached;
public bool RightWheelAttached;
}
MotorcycleAxle オブジェクトのみを Motorcycle オブジェクトの Axles 配列に格納し、CarAxle オブジェクトを Car オブジェクトの Axles 配列に格納したいと考えています。問題は、サブクラスの配列をオーバーライドしてどちらか一方を強制する方法がないことです。理想的には、Motorcycle クラスには次のようなものが有効です。
class Motorcycle : Vehicle
{
public override List<MotorcycleAxle> Axles;
}
ただし、オーバーライドするときは型が一致する必要があります。このアーキテクチャをどのようにサポートできますか? Axles メンバーがアクセスされる場所で、多くの実行時の型チェックとキャストを行う必要があるだけですか? 実行時の型チェックを追加するのは好きではありません。強い型付けとポリモーフィズムの利点が失われ始めるからです。WheelAttached および Left/RightWheelAttached プロパティはタイプに依存するため、このシナリオでは少なくともいくつかの実行時チェックが必要ですが、それらを最小限に抑えたいと考えています。