では、次のフットボール クラブをモデル化しているとしましょう。すべての人は個人です。プレーヤーは人であるため、個人を拡張します。メンバーは個人であるため、個人を拡張します。
スーパークラス:
Individual {name, eyeColour}
サブクラス:
Player extends Individual {position}
Member extends Individual {subscription}
トムはフットボール クラブのオーナーです。
Individual i = new Individual("Tom", "Blue")
ボブとトニーはプレイヤーです:
Player p1 = new Player("Bob", "Green", "Goalkeeper")
Player p2 = new Player("Tony", "Blue", "Striker")
スティーブはメンバーです:
Member m = new Member("Steve", "Brown", 5.00)
個人、プレーヤー、およびメンバーはすべて、Objectify を使用して GAE データストア内の同じ種類 (個人) に永続化されます。
名前 eyeColor ポジション サブスクリプション ^d トム・ブルー [行方不明] [行方不明] 個人 ボブ グリーン ゴールキーパー [行方不明] 選手 トニー ブルー ストライカー [行方不明] 選手 スティーブ ブラウン [行方不明] 5.00 メンバー
たとえば、ボブがプレイヤーだけでなくメンバーになることを決定した場合はどうなりますか? 保存したいのはサブスクリプションです。Bob を個人にアップキャストしてからメンバーにダウンキャストすることはできません。Java はこれを許可しません。新しいメンバーを作成して、ボブのプレーヤー オブジェクトのすべてのプロパティをコピーし、同じ ID で保存することができません。ボブの位置プロパティが失われます。ボブがデータストアのメンバーとプレーヤーの両方である必要がありますが、オブジェクト形式ではありません (私は多重継承の後ではないです)。 (Member.class,"Bob") であり、Member オブジェクトを持っています。位置とサブスクリプションの両方のプロパティを同時に持つオブジェクトは必要ありません。
また、これを避けたいのはデータストアです:
名前 eyeColor ポジション サブスクリプション ^d トム・ブルー [行方不明] [行方不明] 個人 ボブ グリーン ゴールキーパー [行方不明] 選手 ボブ・グリーン [行方不明] 10.00 メンバー トニー ブルー ストライカー [行方不明] 選手 スティーブ ブラウン [行方不明] 5.00 メンバー
Bob の名前と eyeColour のデータが重複しているため、データの不一致が生じる可能性があります。
これをモデル化する方法についてのアイデアはありますか?
また、トムがプレイヤーになったり、スティーブがメンバーになったりしたらどうしますか?