首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对vehicles进行分类-继承与接口

如何对vehicles进行分类-继承与接口
EN

Stack Overflow用户
提问于 2016-02-12 08:45:01
回答 3查看 202关注 0票数 3

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

为什么我会感到困惑?如果你仔细想想,车辆可以按多种方式进行分类:

1)车辆性质:陆地车辆、WaterCrafts和AirCrafts。2)另一种分类方式:动力车辆和NonPowered车辆,如拖拉机(无动力,仅与卡车相连),卡车等。3)车辆的装载性质:车辆可以装载或不装载。

让我举个例子: Vehicle ->陆地车辆-> Powered/NonPowered ->可加载/不可加载。

如果你看到了,我创建了许多子类,但是除了属性差异,它还能有什么用呢,它是否可加载。我也可以使用接口来做到这一点。在车辆上实现可加载?供电接口,允许加载。

例如: vehicle -> LandVehicle ->拖拉机LandVehicle将实现像isPowered和isLoadable这样的接口,这些接口将被拖拉机覆盖为false和true。

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

解决这类问题的最好方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2016-02-12 09:00:46

解决这类问题的最好方法是使用KISS规则:保持简单愚蠢!

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

然而,如果你不想为每个类别添加行为,而只是想要一些Vehicle的描述,那么可以通过执行以下操作来使用组合:

代码语言:javascript
复制
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
}

你可以在你的Vehicle类中添加任意多的"Description“类型枚举列表(这样你就可以避免像Loadable和NonLoadable这样的事情),而且你只需要几个类!

总之,尽可能使用组合。

票数 1
EN

Stack Overflow用户

发布于 2016-02-12 09:30:36

这些Vehicles在功能或属性方面是否有所不同

  1. 属性:使用Builder_pattern构建具有不同attributes.
  2. Capabilities:的不同类型的车辆,使用接口提供不同的功能,并定义Decorator来添加功能。

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

您可以在Vehicle类中使用Composite_pattern作为功能列表。Vehicle类将维护List < Capability >

看一下这些示例:

Keeping builder in separate class (fluent interface)

When to Use the Decorator Pattern?

票数 1
EN

Stack Overflow用户

发布于 2016-02-12 17:18:17

组合在您的情况下匹配得更好。想象一下,您的车辆由点火系统、燃油系统、变速器、客舱等部件组成。正如您所看到的,许多类型的车辆都有独特的部件: 2、3、4轮、履带、悬停/前轮驱动、rwd、全速驱动/内燃机(燃油系统)或电动(电气系统)。继承会使你的架构受到很大的限制,并且很难修改。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35352882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档