如何对车辆进行分类 - 继承与接口

时间:2016-02-12 00:45:01

标签: java inheritance design-patterns interface

我正在尝试对车辆进行分类,但我不确定最佳方法是什么。

为什么我感到困惑? 如果你考虑一下,可以通过多种方式对车辆进行分类:

1)车辆的性质:陆地车辆,水车和水车。飞行器。 2)另一种分类方式:动力车辆和无动力车辆,如拖拉机(非动力,只附卡车),卡车等。 3)车辆的装载性质:车辆是否装载。

让我举一个例子: 车辆 - >陆地车辆 - >动力/无动力 - >可加载/ NonLoadable。

如果你看到,我正在创建许多子类,但除了可加载与否之外的属性差异之外还有什么用途。我也可以使用接口来做到这一点。实现可装载的车载接口,可以进行装载。

例如: 车辆 - > LandVehicle - >拖拉机 LandVehicle将实现像isPowered和isLoadable这样的接口,拖拉机会将其覆盖为false和true resp。

我知道继承是针对“isa”关系和“可以做”的接口,但是如何在这里产生差异,因为它可以互换使用。

解决此类问题的最佳方法是什么。

3 个答案:

答案 0 :(得分:1)

解决此类问题的最佳方法是使用 KISS 规则:保持简单傻!

在这种情况下,请使用" major"分类中的分歧,并使用" minor"分类中的分歧。这是因为 Java只允许单继承主要部门),但是对接口数量没有限制小班子)班级可以实施。

然而, 如果您 希望为每个类别添加行为,并且只想要{{1}的某些描述通过执行以下操作来使用组合:

Vehicle

您可以添加尽可能多的"说明"您可以根据需要在您的Vehicle类中键入枚举列表(这样您就可以防止执行可加载和非可加载的操作),并且您只需要几个类!

总之,尽可能使用构图。

答案 1 :(得分:1)

这些Vehicles是否因功能属性而不同?

  1. 属性:使用Builder_pattern构建具有不同属性的不同类型的车辆。

  2. 功能:使用界面提供不同的功能,并定义Decorator以添加功能。

  3. 如果您需要混合两者,请正确使用Builder + Decorator模式。

    您可以使用Composite_pattern获取Vehicle课程中的功能列表。 Vehicle课程将保留List < Capability >

    看看这些例子:

    Keeping builder in separate class (fluent interface)

    When to Use the Decorator Pattern?

答案 2 :(得分:0)

组合在您的情况下更好地匹配。想象一下,您的车辆由点火系统,燃油系统,变速箱,驾驶室等部件组成。您可以看到许多类型都有独特的部件:2,3,4轮,履带,悬停/前进,后轮,发动机/内燃机(燃料系统意味着)或电动(电力系统)。继承将使您的体系结构受到限制并且难以修改。

通过合成,您甚至无需对车辆进行分类。只需添加组件即可。如果您想使用过滤器按照车轮数量,驱动器类型等参数搜索车辆 - 您可以使用接受标准并查找其车辆组件的方法来实现ISearchable接口,无论它们是否都符合标准。