2

全て、

私はこれを間違っている必要があります。当時は良いアイデアのように思えましたが、深く掘り下げていくにつれて、より適切なプログラマティックな方法があると思います。そこでお聞きします...

1 つのメモ。この情報を保存するために Google AppEngine とデータストアを使用しています。

わかりました... 車両のスーパー クラスがあり、それには 3 つのサブクラスがあります... 車、トラック、オートバイ。

スーパークラスには、メーカー、モデル、タイプの 3 つのプロパティがあります。

たとえば、次のようになります。

  • メーカー: フォード
  • モデル: フォーカス
  • タイプ: 車

したがって、データストアには、これらのプロパティを持つ多数の Vehicle エンティティがあります。したがって、ユーザーがすべての車を見たい場合は、「車」タイプですべてをプルします。

ユーザーがこれらの車両の 1 つを「お気に入り」リストに追加したい場合は、車両オブジェクトをそのタイプに基づいて特定のサブクラスに変換します。これにより、その特定のサブクラスの追加のプロパティが追加されます。

この新しい子エンティティは、追加されたプロパティとともにデータストアに保存されます。

つまり、基本的には、たとえば、Vehicle から Car にダウンキャストしています。これは、引数として Vehicle を取る Car クラスに追加のコンストラクターを作成することで実現しました。作成されると、Car オブジェクトにはすべてのプロパティ (Manufacturer、Model、Type) が設定され、特定の実装に付属するすべての新しいプロパティが設定されます。

これは複雑で間違っているようです。それは機能しますが、これを行うためのより良い方法が必要です。

この方法を選択した主な理由は、GAE データストアの仕組みにあります。スーパークラスとその制限されたプロパティを保存してそれらをクエリする方が「安価」です。長い話。

このためにインターフェイスや抽象クラスを使用して頭を包み込もうとしていますが、すべての入力を取得したかったのです。

助けてくれてありがとう。

4

2 に答える 2

0

ここにスーパー/サブクラス構造が必要だとは思いません。説明されている問題では、オブジェクトをあるタイプから別のタイプに「変更」しており、Java オブジェクトのタイプを変更することはできません。新しいオブジェクトを作成できますが、すべての情報を別のオブジェクトに移動する必要があり、メンテナンスが問題になります。

車両を表すクラスを作成し、そのクラスにタイプ固有の情報への参照を含めることをお勧めします。特定の各タイプを表すクラスはすべて何かを拡張できます。おそらく、そのタイプで何かを実行しようとする車両内のメソッドが、タイプに関係なくそれを実行するために共通のメソッドを呼び出すことができるようにする必要があります。ただし、この方法では、特定のタイプを決定したら、それを「変更」する代わりに、既存の車両オブジェクトに追加できます。

列挙型が型固有のデータの目的に役立つかどうかを調べることもできます-列挙型はコンストラクターを取り、追加のメソッドを持つことができます.-列挙型に関するOracle / Javaチュートリアルはそれをかなりよくカバーしています。

于 2013-12-18T20:28:36.030 に答える
0

車両のタイプは 2 回エンコードされます。1 回はオブジェクト タイプとして、もう 1 回はプロパティとしてです。プロパティ値が Car に設定されたトラック (オブジェクト タイプ) を持つ可能性がないように、これらのいずれかを取り除きます。オブジェクトの構造、または車両の種類を示すプロパティ (Enum を使用することをお勧めします) を保持しますが、両方は保持しないでください。

ダウンキャストするために、子型の新しいオブジェクトを作成する必要はありません。ただダウンキャスト:

Car myCar = (vehicle instanceof Car ? (Car)vehicle : null);
于 2013-12-18T20:31:26.703 に答える