2

所有,什么是更好的方法?溯造型?接口?抽象类?

我必须这样做不对。这在当时似乎是一个好主意,但随着我进一步深入,我认为有一个更合适的方案去实现它。因此,我问你...

一注。我正在使用Google AppEngine和数据存储来存储这些信息。

好吧......可以说我有车的一个超类,然后有3个子类...汽车,卡车,摩托车。

在超类中,有3个属性...制造商,型号,类型

例如,这些可能是:

  • 制造商:福特
  • 型号:关注
  • 类型:汽车

所以在数据存储中,我有许多具有这些属性的Vehicle实体。 所以,如果用户想要看到所有的汽车......我用“汽车”类型来拉动汽车。

然后,如果用户想要添加这些车辆之一的“收藏夹”列表中,我基于它是什么类型,然后转换的车对象到其具体的子类。然后添加该特定子类的额外属性。

这个新的子实体存储在数据存储中,并添加了它的属性。

所以基本上,我是从汽车到汽车的向下转弯。我通过在Car类中创建一个额外的构造函数来完成此操作,该类将Vehicle作为参数。一旦创建,Car对象现在具有所有属性(制造商,型号,类型)集以及与其特定实现一起提供的所有新属性。

这似乎错综复杂,错误。它的工作原理,但必须有一个更好的方式来做到这一点。

我选择了这条路的主要原因是因为GAE数据存储的工作方式。它的“便宜”来存储超级类别和它的有限属性并查询它们。很长的故事。

我试图环绕使用接口和/或抽象类为这个我的头,但我希望得到您的所有投入。

感谢您的帮助。

回答

0

我不认为你想在这里超级/子类结构。您所描述的问题是您将对象从一种类型“更改”为另一种类型,并且您无法更改Java对象的类型。您可以创建一个新对象,但是必须将所有信息从一个移动到另一个,并且维护成为问题。

我建议你有一个代表你的车一类,而且它包含的参考输入特定信息;代表每个特定类型的类都可以扩展某些内容,并且可能应该使得车辆内部尝试使用该类型的方法可以调用常用方法来执行,而不管类型如何。但这样,一旦你决定了具体的类型,你可以将它添加到现有的车辆对象,而不是“改变”它。

你也可以探索一个枚举类型是否可以满足你对类型特定数据的需求 - 枚举类型可以使用构造函数,还可以使用额外的方法等。 - 有关枚举的Oracle/Java教程涵盖了这一点。

0

车辆类型被编码两次:一次作为对象类型,一次作为属性。摆脱其中的一个,这样就不会有卡车(对象类型)的属性值设置为Car的可能性。保持你的物体结构或属性指出车辆的类型(我推荐使用Enum),但不能同时使用两者。

要降级,您不需要创建子类型的新对象。只是沮丧:

Car myCar = (vehicle instanceof Car ? (Car)vehicle : null); 
相关问题