【发布时间】:2014-10-09 11:30:48
【问题描述】:
在解释我的问题之前,我应该做一些理论...
对于车辆,我指的是所有可以通过公路运输货物的东西:汽车、货车、卡车、拖车(或公路列车,我不知道正确的术语)、半拖车(也称为铰接式卡车或牵引车)。
关于轿车、货车和卡车,没有问题:它们有车牌、重量和可运输体积,以及其他数据。
但其他两辆车更复杂。他们可能有额外的车牌和其他额外数据。特别是:
半挂车(又称牵引车)是一种复杂的车辆,由公路牵引车和半挂车组成。
拖车(也称为...)是一种复杂的车辆,由驱动部分(汽车、厢式货车、卡车...)和驱动部分组成部分(拖车,购物车附录......)。 在欧洲,最多两个组装零件。
所以我们还必须处理 semi-trailers、trailers 和 carts。
在我的软件中,它们可以以不同的方式相互组装。 例如,我可以拿一辆拖车从拖车上拉出来,然后只获得一辆卡车和一辆拖车。 不过,我可以乘坐同一辆卡车,如果兼容,可以攻击另一辆不同的拖车。等等……
在我看来很明显,我们不能用类 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