4

我有一个面试问题,询问我将如何设计一个系统来在售货亭展示汽车/卡车/货车,以便客户可以查看车辆的规格。(警告:我最近没有做太多的 OO 编程,所以可能会出现不好的词汇)

我说我是从一类具有非常基本属性的车辆开始的,比如轴距、传动系统、马力。然后我会将其细分为汽车、卡车或货车,在那里我可以进行更具体的测量,例如卡车的床长或汽车的后备箱容量。

然后他们问,我将如何添加选项。我说选项可能存在于任何车辆上,所以我会说车辆可以有一个选项列表。

最后他们问,如果有一个选项只适用于卡车和货车而不是汽车,我有点难过。鉴于我描述的布局,有什么方法可以很好地实现这一点吗?有没有更好的方法来设置类层次结构来解决这个问题?或者这只是一个更复杂的问题,如果不添加一些额外的逻辑就无法轻松解决?

4

3 回答 3

4

这种情况有几个选项。

首先,最简单的:

选项 #1 - 卡车/货车接口

如果只有卡车和货车实现选项,则创建一个名为 IVehicleOptions 的接口并让卡车和货车实现它:

public interface VehicleOptions
{
  Options { get; }
}

这样做的缺点是,现在您必须以不同于卡车和货车的方式对待汽车。

选项 #2 - 空设计模式

但是,您可以使用Null 设计模式。让 Car 实现 IVehicleOptions,然后返回 null:

public class Car : IVehicleOptions
{
  public VehicleOptions { get { return null; } }
}

选项 #3 - 策略模式

创建一个基类,例如 Vehicle:

public abstract class Vehicle
{
  public Options Options { get; protected set; }
}

并让每个具体类设置它:

public class Car : Vehicle
{
  public Car()
  {
    this.Options = NullOptions();  // This is the null design pattern used with this strategy pattern
  }
}

public class Truck : Vehicle
{
  public Truck
  {
    this.Options = SuperOptions();
  }
}

public class Van: Vehicle
{
  public Van
  {
    this.Options = ElegantOptions();
  }
}

Now all vehicles can be treated the same way (as a Vehicle).

于 2012-04-26T22:45:16.003 回答
2

1* 进行Vehicle抽象,以便它必须像Class Car extends Vehicle.

2* 所有的抽象方法都必须由所有的具体子实现,但所有的方法都必须是抽象的。所以使用部分实现。

3* 因此,如果您需要类选项TruckVan不需要Car,请在Vehicle. 自从它实施以来,任何孩子都可以选择(或不)覆盖它。

4* 你也可以使用接口。Truck并且Van可以共享一个Car不需要共享的接口。

由于您已经有一段时间了,您应该查看:http ://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

于 2012-04-26T22:40:45.133 回答
0

Since Van and Truck have extra feature which car do not have and we cant add that feature in the common interface, I think of segregating the interface which is one of the SOLID principle wherein van and truck would implement another interface which extends the basic interface. Mean to say:-

Interface IVehicle{
void move();
} 
Interface IVehicleExtra extends IVehicle{
// Have methods for extra features for Van and Truck
void limitSpeedEighty();
}
class Car implements IVehicle{
void move(){
}
}
class Van implements IVehicleExtra{
void move(){
}
void limitSpeedEighty(){
}
}
class Truck implements IVehicleExtra{
void move(){
}
void limitSpeedEighty(){
}
}

I hope my understanding and presentation is clear.

于 2013-07-23T17:39:24.217 回答