【问题标题】:What is a better way? Downcasting? Interface? Abstract class?有什么更好的方法?垂头丧气?界面?抽象类?
【发布时间】:2016-09-17 12:37:20
【问题描述】:

全部,

我一定是做错了。当时这似乎是一个好主意,但随着我深入研究,我认为有一种更合适的编程方式来处理它。所以我问你...

一个音符。我正在使用 Google AppEngine 和 Datastore 来存储这些信息。

好吧...假设我有一个超级类车辆,然后有 3 个子类...汽车、卡车、摩托车。

在 Super Class 中,有 3 个属性...Manufacturer、Model、Type

例如,这些可能是:

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

因此,在 Datastore 中,我有许多具有这些属性的 Vehicle 实体。 因此,如果用户想查看所有汽车...我将所有内容都使用“汽车”类型。

如果用户想要将这些车辆之一添加到“收藏夹”列表中,我会根据车辆的类型将车辆对象转换为其特定的子类。然后添加该特定子类的额外属性。

这个新的子实体连同其添加的属性一起存储在数据存储区中。

所以基本上,例如,我从车辆转向汽车。我通过在 Car 类中创建一个额外的构造函数来实现这一点,该构造函数将 Vehicle 作为参数。创建后,Car 对象现在具有所有属性(制造商、模型、类型)集,以及其特定实现附带的所有新属性。

这似乎令人费解且错误。它有效,但必须有更好的方法来做到这一点。

我选择这种方式的主要原因是因为 GAE 数据存储的工作方式。存储超类及其有限属性并查询它们“更便宜”。说来话长。

我正在尝试使用接口和/或抽象类来解决这个问题,但我想获得您的所有输入。

感谢您的帮助。

【问题讨论】:

    标签: java google-app-engine inheritance google-cloud-datastore object-composition


    【解决方案1】:

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

    我建议您有一个代表您的车辆的类,并且它包含对特定类型信息的引用;代表每个特定类型的类都可以扩展某些东西,并且可能应该这样,以便车辆中尝试对该类型执行某些操作的方法可以调用通用方法来执行此操作,而不管类型如何。但是这样一来,一旦确定了具体类型,就可以将其添加到现有的车辆对象中,而不是“更改”它。

    您还可以探索枚举类型是否可以为特定类型的数据服务 - 枚举类型可以采用构造函数、具有其他方法等 - 有关枚举的 Oracle/Java 教程很好地涵盖了这一点。

    【讨论】:

      【解决方案2】:

      车辆类型被编码两次:一次作为对象类型,一次作为属性。去掉其中一个,这样就不可能有一个属性值设置为 Car 的卡车(对象类型)。保持你的对象结构或属性指出车辆的类型(我建议使用枚举),但不能同时使用两者。

      要向下转换,您不需要创建子类型的新对象。只是沮丧:

      Car myCar = (vehicle instanceof Car ? (Car)vehicle : null);
      

      【讨论】:

        猜你喜欢
        • 2010-12-04
        • 2018-10-31
        • 2019-02-13
        • 1970-01-01
        • 2021-12-25
        • 2013-10-17
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多