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

Java 如何对车辆进行分类-继承与接口,java,inheritance,design-patterns,interface,Java,Inheritance,Design Patterns,Interface,我正在尝试对车辆进行分类,但我不确定什么是最好的方法 为什么我感到困惑? 仔细想想,车辆可以通过多种方式进行分类: 1) 车辆性质:陆地车辆、船只和飞机。 2) 另一种分类方式:机动车辆和非机动车辆,如拖拉机(非机动且仅与卡车相连)、卡车等。 3) 车辆装载性质:车辆可以装载也可以不装载 让我举一个例子: 车辆->陆上车辆->动力/非动力->可装载/非装载 如果你看到了,我正在创建许多子类,但是除了属性差异之外,它的用途是什么,它是可加载的还是不可加载的。我也可以使用接口来实现这一点。为车辆提供

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

为什么我感到困惑? 仔细想想,车辆可以通过多种方式进行分类:

1) 车辆性质:陆地车辆、船只和飞机。 2) 另一种分类方式:机动车辆和非机动车辆,如拖拉机(非机动且仅与卡车相连)、卡车等。 3) 车辆装载性质:车辆可以装载也可以不装载

让我举一个例子: 车辆->陆上车辆->动力/非动力->可装载/非装载

如果你看到了,我正在创建许多子类,但是除了属性差异之外,它的用途是什么,它是可加载的还是不可加载的。我也可以使用接口来实现这一点。为车辆提供可装载?供电接口,允许装载

例如: 车辆->陆地车辆->拖拉机 LandVehicle将实现诸如iPowered和isLoadable之类的接口,这些接口将被拖拉机覆盖为false和true resp

我知道继承是为了“isa”关系,接口是为了“can do”,但这在这里有什么不同,因为它可以互换使用


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

解决这类问题的最佳方法是使用亲吻规则:保持简单愚蠢

在这种情况下,对分类中的“主要”部分使用继承,对分类中的“次要”部分使用接口。这是因为Java只允许单一继承(主要部分),但对类可以实现的接口数量没有限制

但是,如果您不想为每个类别添加行为,只想对
车辆进行一些描述,请通过以下方式使用合成:

public class Vehicle {
    private List<VehicleDescription> descriptions = new ArrayList<VehicleDescription>();

    public void addDescription(VehicleDescription description) {
        descriptions.add(description);
    }

    public boolean hasDescription(VehicleDescription description) {
        return descriptions.indexOf(description) > -1;
}

public enum VehicleDescription {
    Land, Water, Air, Powered, NonPowered, Loadable, NonLoadable
}
公共级车辆{
私有列表描述=新建ArrayList();
公共无效添加说明(车辆说明说明){
说明。添加(说明);
}
公共描述(车辆描述描述){
返回说明。indexOf(description)>-1;
}
公共枚举车辆描述{
陆上、水上、空气、动力、非动力、可装载、非装载
}
您可以根据需要在车辆类中添加任意多个“描述”类型枚举列表(这样您就可以防止同时执行可加载和不可加载的操作),并且您只需要几个类


总之,尽可能使用合成。

这些
车辆的性能或属性是否不同

  • 属性:用于构建具有不同属性的不同类型的车辆

  • 功能:使用接口提供不同的功能,并定义以添加功能

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

    您可以用于
    车辆
    类中的功能列表。
    车辆
    类将维护
    列表

    请看以下示例:


    组合与您的情况更匹配。想象您的车辆由点火系统、燃油系统、变速器、座舱等部件组成。您可以看到许多类型的车辆都有独特的部件:2、3、4轮、履带、悬停/前进档、后轮驱动、全轮驱动/内燃机(燃油系统)或电动(电气系统).继承将使您的体系结构非常受限,并且很难修改


    使用composition,您甚至不需要对车辆进行分类。只需将组件添加到车辆中。如果您想使用筛选器按参数(如车轮数量、驾驶类型)搜索车辆,您可以使用接受条件的方法实现ISearchable接口,并查找其车辆组件,以确定是否所有组件都符合条件.

    解决这些问题的最佳方法是使用组合而不是继承。有人可能会对您的特定问题给出答案,但请参见:谢谢WW。我认为组合在这方面对我没有帮助,或者如果真的有帮助,我可能需要重新考虑。多属性+多属性组合==装饰模式。您“我们必须解释它们在行为和属性上的差异……水上飞机怎么办?