Я пытаюсь настроить иерархию наследования, подобную следующей:
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 в массиве Axles объекта Motorcycle и объекты CarAxle в массиве Axles объекта Car. Проблема в том, что нет способа переопределить массив в подклассе для принудительного использования одного или другого. В идеале, что-то вроде следующего будет действительным для класса Мотоцикл:
class Motorcycle : Vehicle
{
public override List<MotorcycleAxle> Axles;
}
но типы должны совпадать при переопределении. Как я могу поддержать эту архитектуру? Должен ли я просто выполнять много проверок и приведение типов во время выполнения везде, где есть доступ к элементу Axles? Мне не нравится добавлять проверки типов во время выполнения, потому что вы начинаете терять преимущества строгой типизации и полиморфизма. В этом сценарии должны быть хотя бы некоторые проверки во время выполнения, поскольку свойства WheelAttached и Left / RightWheelAttached зависят от типа, но я бы хотел их минимизировать.