1

是否可以将已从同一抽象对象扩展而来的不同对象存储在单个容器中,并能够访问这些对象的所有自定义字段。让我举个例子:假设我有两辆车:福特和本田。由于所有汽车都有重量和颜色,我可以制作以下抽象类:

public abstract class Car{

  private double weight; 
  private String color;

  public Car(){
    this.weight=0;
    this.color="";
  }
  ...getters and 
  ...setters
}

现在假设我的 Ford 类有一个附加字段“ radio ”,如下所示:

public Ford extends Car(){
private String radio;

public Ford(){
super();
this.radio = "generic";
}
}

同样,本田类有一个自定义字段“相机

public Honda extends Car(){
  private String camera;

  public Honda(){
    super();
    this.camera= "analog";
  }
}

是否可以将这些类的实例保存在单个容器中,如下所示。请注意下面的代码有效,但这不是我想要的。请参阅下面的评论:

Ford ford = new Ford();
Honda honda = new Honda();
ArrayList<Car> myCars = new ArrayList<Car>();
myCars.add(ford);
myCars.add(honda);

这是我的问题: 当我这样做时,myCars.get(0)我得到了一个类对象Car(显然)并且永远无法获得自定义字段radio。当然,我可以做类似的事情((Ford) myCars.get(0))并且能够看到无线电场,但是是否有可能创建一个更好的容器来显示所有字段而无需向下转换等,例如: myContainer.get(0)- 将返回福特类,我会获得重量、颜色和收音机 myContainer.get(1)——将返回本田课程,我将获得重量、颜色和相机

我的直觉告诉我,解决方案就在附近,而且是可能的,但是我在 Java 方面的专业知识还没有达到。也许我必须对某种泛型或哈希图做些什么?

谢谢你们!!

4

3 回答 3

2

有几种选择,没有一种完全符合您的理想。

  • 您可以为Car类中的特定属性添加所有 getter,并在它们不适用的地方返回Null或抛出异常。
  • 您可以应用访问者模式
  • 您可以创建一个CarContainer类来包装您的列表并具有返回特定类型的所有元素的方法,例如List<Ford> getAllTheFords(). 通过这种方式,您可以在容器类中隐藏丑陋的演员表。

我根据个人喜好列出了替代方案:-)

于 2012-08-08T15:54:56.747 回答
2

你可以做的是使用泛型。

您的存储库可以实现这些方法:

public static <T extends Car> T getFromRepository(Class<T> type, Object key) 
public static <T extends Car> boolean addToRepository(Class<T> type, Object key, T value)

然后你可以用类似的东西来调用它(假设你已经有了福特的钥匙):

Ford ford = Repository.getFromRepository(Ford.class, fordKey)

当然,您可以实现方法来获取给定类型的所有对象等等......

PS:一个简单的替代方案,如果您可以在子类上使用相同的方法是模板方法模式: http ://en.wikipedia.org/wiki/Template_method_pattern

于 2012-08-08T15:55:17.677 回答
1

myCars.get(0)确实返回一个福特对象。除了这仅在运行时已知。问题是要调用car.radio,您需要知道它是福特汽车,如果不是,则不能调用该方法。所以无论如何你都需要检查类型和演员表。

List<Accessory>一种解决方案是向您的抽象类添加一个字段。

您现在可以编写如下内容:

Car car = cars.get(0);
if (car.hasAccessories()) {
    car.getAccessory(0).operate();
}

不确定这是否是您的用例所需要的。

于 2012-08-08T15:55:15.837 回答