抽象继承列表中的约束 class

Constraints in inherited list of abstract class

我在一个隐含了一些抽象的复杂项目中碰壁了。 出于隐私目的,我尝试将我的问题中的项目翻译成更常见的项目,所以这听起来有点荒谬,但我向你保证它在其原始上下文中是有意义的。

开始了。

假设我有货运(例如飞机和货船)

public abstract class Freight { }
public class Ship: Freight { }
public class Plane: Freight { }

现在按照设计选择,货运就是运输车辆。所以所有货运都会有一个车辆列表或数组。 (在我们的例子中,让我们选择列表)

public abstract class Vehicle { }
public abstract class Freight
{
    public List<Vehicle> vehicles { get; }
}

然后,同样根据设计选择,飞机仅用于运输摩托车,而轮船仅用于运输汽车。这就是我的问题出现的地方。我该怎么做?

我的第一个想法是在运费中抽象列表 属性,这样它就需要在特定的运费中被覆盖(可能会详细说明它是如何以不同方式加载到运费中的),但在这样做的过程中,我还没有找到一种方法来指定或约束货运摘要列表的内容,以确保所有货运都必须有其车辆列表。

public abstract class Vehicle { }
public class Motorbike : Vehicle { }
public class Car : Vehicle { }

public abstract class Freight
{
    // This becomes abstract, maybe ?
    public abstract List<Vehicle> vehicles { get; }
}

public class Cargo: Freight
{
    // Tentative #1
    public override List<Vehicle> vehicles where Vehicle : Car { get; }
}

public class Plane: Freight
{
    // Tentative #2
    public override List<Motorbike> vehicles { get; }   
}

但其中 none 似乎有效。

我的问题是:是否有抽象设计概念可以让我达到我应该知道的规范/约束目标,并且可以帮助我弥补我所缺少的?。或者是否有关于此类主题的关于替代设计以实现预期行为的任何官方(Microsoft)建议?

尝试澄清这个概念如下(在回答后编辑): 该软件试图模仿非软件的规则和行为。这些在其自己的文档中进行了描述,规则集对物理产品及其应用有意义,并且 how/what 限制在其制造过程中适用。我将这个概念翻译成货运,因为这是我想到的唯一“简单”示例,没有详细说明我公司生产的产品,以及为什么这些限制是这样的。

我希望我已经足够清楚了,我发现这很难解释,因为它很难找到解决方案。所以我感谢你试图理解。

非常感谢。

这听起来像是仿制药的工作。您可以给 Freight 一个 T 的列表,而不是制作 Vehicle 的列表,然后将 T 约束为 Vehicle 的子类:

public abstract class Vehicle { }
public class Motorbike : Vehicle { }
public class Car : Vehicle { }

public abstract class Freight<T>
   where T: Vehicle
{
    public List<T> Vehicles { get; }
}

public class Ship: Freight<Car>
{
}

public class Plane: Freight<Motorbike>
{
}