好吧,假设我正在为以下足球俱乐部建模: 所有人都是个人。 玩家是一个人,因此延伸为一个个体。 成员(member)是一个人,因此延伸为一个个人。
父类(super class):
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):
Member m = new Member("Steve", "Brown", 5.00)
个人、玩家和成员(member)都使用 Objectify 在 GAE 数据存储中保留为同一种类(个人)。
name eyeColour position subscription ^d Tom Blue [missing] [missing] Individual Bob Green Goalkeeper [missing] Player Tony Blue Striker [missing] Player Steve Brown [missing] 5.00 Member
如果例如鲍勃决定既成为成员(member)又成为玩家?我想存储的是订阅。 我不能将鲍勃提升为个人,然后又贬低为成员(member)。 Java 不允许这样做。 我无法创建新的 Member 并复制 Bob 的 Player 对象的所有属性并使用相同的 id 将其存储回来 - 我将丢失他的 Position 属性。 我需要鲍勃既是数据存储中的成员又是玩家,但不是对象形式(我不追求多重继承) 我仍然想要 get(Player.class,"Bob") 并拥有一个 Player 对象或 get(Member.class,"Bob") 并拥有一个 Member 对象。 我不需要一个同时具有位置和订阅属性的对象。
我也想避免这是数据存储:
name eyeColour position subscription ^d Tom Blue [missing] [missing] Individual Bob Green Goalkeeper [missing] Player Bob Green [missing] 10.00 Member Tony Blue Striker [missing] Player Steve Brown [missing] 5.00 Member
因为Bob现在在名称和眼睛颜色上有重复的数据,这可能会导致数据不一致。
关于如何建模有什么想法吗?
如果汤姆成为玩家,或者史蒂夫成为成员(member)怎么办?
最佳答案
Individual {name, eyeColour}
MemberRole {individual, position}
PlayerRole {individual, subscription}
很明显,继承不适合您的任务。例如,某人可能在两个不同的球队踢球,或者是两个不同俱乐部的成员(并且您最初的结构根本不允许拥有多个足球俱乐部)。
个人是什么以及他们扮演什么角色是不同的事情。例如,您不希望某些全局数据库将您的姓名、stackoverflow 积分、婚姻状况和职业全部存储在同一个 Individual
表中。
如果鲍勃决定成为成员(member),鲍勃本身不会改变;它的角色确实如此。决定成为成员(member)的鲍勃仍然是那个善良的老鲍勃,只是他现在能够做一些他之前被禁止做的事情。
PS:您在答案中使用了术语订阅。这就是您的播放器——订阅。 Subscription
显然不是 Individual
的某个特定子集,Subscription
是一个完全不同的实体。当然,它应该知道自己属于什么Individual
,但它本身并不是Individual
。
关于java - 如果不是多态性,我如何对这些类进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11241073/