好吧,假设我正在为以下足球俱乐部建模:所有人都是个人。玩家是一个人,因此扩展了个人。会员是一个人,因此扩展了个人。
超类:
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 决定成为会员和玩家怎么办?我要存储的是订阅。我不能将 Bob 上调给个人,然后再下调给会员。Java 不允许这样做。我无法创建新成员并复制 Bob 的 Player 对象的所有属性并使用相同的 id 将其存储回来 - 我将失去他的 Position 属性。我需要 Bob 在 datstore 中既是成员又是玩家,但不是对象形式(我不是在多重继承之后)我仍然想获取(Player.class,“Bob”)并拥有一个玩家对象(Member.class,"Bob") 并拥有一个 Member 对象。我不需要同时具有位置和订阅属性的对象。
我也想避免这是数据存储:
姓名 eyeColor 位置订阅 ^d 汤姆·布鲁[失踪][失踪]个人 鲍勃格林守门员[失踪]球员 鲍勃格林 [失踪] 10.00 会员 托尼·蓝前锋 [失踪] 球员 史蒂夫布朗 [失踪] 5.00 会员
因为 Bob 现在在 name 和 eyeColour 上有数据重复,这可能导致数据不一致。
关于如何建模的任何想法?
另外,如果汤姆成为球员,或者史蒂夫成为会员怎么办?