All,
我一定是做错了。 这在当时似乎是一个好主意,但随着我深入研究它,我认为有一种更合适的程序化方式。 因此,我问你...
一个音符。我正在使用 Google AppEngine 和 Datastore 来存储此信息。
好吧...假设我有一个超级类的车辆,然后有3个子类...汽车,卡车,摩托车。
在超级类中,有3个属性... 制造商, 型号, 类型
例如,这些可能是:
- 制造商:福特
- 型号:焦点
- 类型:汽车
因此,在数据存储中,我有许多具有这些属性的车辆实体。因此,如果用户想要查看所有汽车...我用"汽车"型拉动一切。
如果用户随后想要将这些载具之一添加到"收藏夹"列表中,我会根据其类型将载具对象转换为其特定的子类。 然后,这将添加该特定子类的额外属性。
此新子实体及其添加的属性存储在数据存储中。
所以基本上,我正在向下投掷,例如,从车辆到汽车。 我通过在 Car 类中创建一个额外的构造器来做到这一点,该构造器将车辆作为参数。 创建后,Car 对象现在具有设置的所有属性(制造商、型号、类型)及其特定实现附带的所有新属性。
这似乎令人费解和错误。 它有效,但必须有更好的方法来做到这一点。
我选择这种方式的主要原因是因为 GAE 数据存储的工作方式。存储超级类及其有限的属性并查询这些属性"更便宜"。 说来话长。
我正在尝试为此使用接口和/或抽象类来解决问题,但我想获得您的所有输入。
感谢您的帮助。
我认为你不需要这里的超级/子类结构。 如前所述,您的问题是将对象从一种类型"更改"为另一种类型,并且无法更改 Java 对象的类型。 您可以创建一个新对象,但是您必须将所有信息从一个移动到另一个对象,维护就成了一个问题。
我建议你有一个表示你的车辆的类,它包含对特定于类型的信息的引用;表示每个特定类型的类都可以扩展某些内容,并且可能应该这样车辆中尝试使用该类型执行某些操作的方法可以调用通用方法来执行此操作,而不管类型如何。 但是这样,一旦您决定了特定类型,您就可以将其添加到现有车辆对象中,而不是"更改"它。
您还可以探索枚举类型是否适用于特定于类型的数据 - 枚举类型可以采用构造函数,具有其他方法等 - 关于枚举的 Oracle/Java 教程很好地涵盖了这一点。
车辆类型编码两次:一次作为对象类型,一次作为属性。 删除其中之一,以便不可能将属性值设置为"汽车"的卡车(对象类型)。 保持你的对象结构或属性指出车辆的类型(我建议使用枚举),但不要两者兼而有之。
若要向下转换,则无需创建子类型的新对象。 只是沮丧:
Car myCar = (vehicle instanceof Car ? (Car)vehicle : null);