【问题标题】:Vehicle classes (different type). Best design and implementation车辆类别(不同类型)。最佳设计和实施
【发布时间】:2014-10-09 11:30:48
【问题描述】:

在解释我的问题之前,我应该做一些理论...

对于车辆,我指的是所有可以通过公路运输货物的东西:汽车货车卡车、拖车(或公路列车,我不知道正确的术语)、半拖车(也称为铰接式卡车或牵引车)。

关于轿车、货车和卡车,没有问题:它们有车牌、重量和可运输体积,以及其他数据。

但其他两辆车更复杂。他们可能有额外的车牌和其他额外数据。特别是:

  • 半挂车(又称牵引车)是一种复杂的车辆,由公路牵引车和半挂车组成。

  • 拖车(也称为...)是一种复杂的车辆,由驱动部分(汽车、厢式货车、卡车...)和驱动部分组成部分(拖车,购物车附录......)。 在欧洲,最多两个组装零件。

所以我们还必须处理 semi-trailerstrailerscarts

在我的软件中,它们可以以不同的方式相互组装。 例如,我可以拿一辆拖车从拖车上拉出来,然后只获得一辆卡车和一辆拖车。 不过,我可以乘坐同一辆卡车,如果兼容,可以攻击另一辆不同的拖车。等等……

在我看来很明显,我们不能用类 Vehicle 来管理所有事情......

我想知道处理这一切的最佳方法是什么。最初,我在 Vehicle 类中有一个枚举,它向我展示了车辆的类型。但是当我必须处理复杂的车辆时,我相信它要复杂得多......我也想知道这将如何影响软件的其余部分。

这就是我最初管理 Vehicle 类的方式:

public class Vehicle {

    // kind of
    enum TipoVeicolo {
        AUTO,           // car
        FURGONE,        // van
        AUTOCARRO,      // truck

        /* 

        // for semi-trailer truck:
        TRATTORE_STRADALE   // road tractor
        SEMIRIMORCHIO       // semi-trailer
        AUTOARTICOLATO      // semi-trailer truck

        // for trailer truck:
        RIMORCHIO           // trailer
        AUTOTRENO           // trailer truck
        ...
        */ 
    };

    enum Stato {
        DISPONIBILE,    // Available
        NON_DISPONIBILE,// not available
        IN_VIAGGIO      // on road...
        // ... ?
    }

    private String targa;   // plate
    private String mark;
    private Stato stato;
    private TipoVeicolo tipoVeicolo;

    private float portata;
    private float volume; 

    private short europallet;

    //Date immatricolationDate;
    //String assurance;


    public Vehicle(String targa, TipoVeicolo tipoVeicolo, String mark,  Stato stato, float ptt) {
        this.targa=targa;
        this.tipoVeicolo=tipoVeicolo;
        this.mark=mark;
        this.stato=stato;
        this.ptt=ptt;
    }


    //////////////////////////////////////////////
    // GET and SET methods

    // ...
}

我应该如何处理?继承?

【问题讨论】:

  • 基本上有无限的可能性。就我个人而言,我的做法会有所不同,因为汽车可以拉拖车。看到我要去哪里了吗?
  • 我会做的是有一个车辆块类和一个车辆类。车辆类将包含一组车辆块,这样您就可以管理任何类型的组合。
  • @DaveNewton 是的,汽车也可以拖着拖车。或不。如果一辆拖车你卸下拖车,他不再是拖车,而只是一辆卡车。如果您将半挂车从半挂车上卸下,您只会得到一辆公路拖拉机。应该尽可能接近真实的描述

标签: java polymorphism


【解决方案1】:

对我来说,可以这样做。首先,您创建了非常通用的车辆类,它基本上具有大量的车轮和名称,也许还有其他东西。然后您将其多次扩展以创建机动车辆、没有发动机的车辆、然后是汽车、卡车等等。

此外,您还可以拥有可拖曳的接口和许多其他描述某些特殊能力的接口。这样,您可以通过检查车辆是否实现所需的接口来检查其兼容性。

希望对您有所帮助。祝你好运。

【讨论】:

  • 我遵循这个,似乎是个好主意:现在没问题。很快我会描述它的进展情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2016-09-19
  • 2015-12-28
相关资源
最近更新 更多