2011-10-09 71 views
1

我想写一个驾驶模拟程序,我需要一些关于设计的帮助。我有一个名为RoadObjects的界面,它现在包含车辆和哺乳动物。我需要实施不同类型的汽车,如卡车,轿车,半导体。他们有一些共同的方法和一些独特的方法。稍后,我会添加其他种类的车辆和哺乳动物。我不想使用继承,我试图根据设计原则和模式(如开放原则和工厂模式)来实现这一点。现在的问题是,我应该设计这样的:在Java中实现一个类

RoadObject interface 

Vehicle extends RoadObject 

Mammal extends RoadObject 

SedanImpl implements Vehicle 

TruckImpl implements Vehicle 

People implements Mammal 

...

...

或者我应该只是没有车辆和人员的界面和做到这一点?

RoadObject interface 

SedanImpl implements RoadObject 

TruckImpl implements RoadObject 

People implements RoadObject 

新问题: 我想用一个工厂模式,来选择哪种交通工具例如。所以我做一个VechicleImpl和VechicleImplFactory所以它可能是这样的:

RoadObject interface 

Vehicle extends RoadObject 

VehicleImpl implements Vehicle 

Mammal extends RoadObject 

SedanImpl implements Vehicle 

TruckImpl implements Vehicle 

People implements Mammal 

这是一种糟糕的设计的?因为VehicleImpl会有很多SedanImpl,TruckImpl等的重复方法。或者如果我想要一个创建车辆的工厂,应该在哪里?

+0

建模'Truck'和'Sedan'可能不会需要额外的类所有,所以如果您可以将'Truck'和'Sedan'所需的信息映射到您的'VehicleImpl',那么拥有一辆'VehicleImpl'可以满足您的所有要求。 – home

+0

@Home,但theres的所特有的卡车和轿车 – Dan

+0

真的方法问题,告诉我:-) – home

回答

0

两种方法都是有效的,无论您是否需要车辆的显式抽象取决于您的要求。 SedanImplTruckImpl等可能都有一些共同的车辆,但不虎门功能/动物:

public interface Vehcile extends RoadObject 
    getTires() 
    getEngine() 

正如你在Java中标记这个共同abstract类可能是有用的:

public abstract class AbstractVehicle implements Vehicle { 
    private Integer tires = 4; 

    public Integer getTires() { return this.tires; } 

    /* ... */ 
} 

使TruckImpl可以从AbstractVehicle继承:

public class TruckImpl extends AbstractVehicle { 
    /* ... */ 
} 
0

合理的东西:

- public interface IRoadObject 

- public class People implements IRoadObject 

- public class Vehicle 

- public class Truck extends Vehicle implements IRoadObject 

- public class Sedan extends Vehicle implements IRoadObject 

但是,它仍然取决于需求。没有明确的要求,我想这很简单。

0

我觉得车辆&人是个好主意。我会为此使用抽象类。

也想想行为。校车有一些不同于摩托车的行为,你可以用接口来实现。

around here的一些更多的想法。