java - 如果不是多态性,我如何对这些类进行建模

标签 java oop google-app-engine google-cloud-datastore objectify

好吧,假设我正在为以下足球俱乐部建模: 所有人都是个人。 玩家是一个人,因此延伸为一个个体。 成员(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/

相关文章:

java - Spring 同步问题

java - 如何在骨架实现(即类)中实现一个接口(interface),该接口(interface)的两个实例可以相互依赖,而无需向下转型?

python - 有什么方法可以创建不污染其实例的属性命名空间的 Python 类方法吗?

Java 到 Cpp 代码转换 : compareTo

java - 如何从 URL 检索图像并将其存储为 Java 中的 Blob(谷歌应用引擎)

java - Google App Engine 的负载平衡器如何工作?

java - InvalidMediaTypeException - 我受到攻击了吗?

java - 一个方法可以在Java中使用反射找出自己的名字吗

python - 谷歌应用引擎 : Permalink generation

java - 从 MainActivity 调用具有参数上下文和属性集的方法