如果不是多态,我该如何为这些类建模

Kev*_*vin 2 java oop google-app-engine objectify google-cloud-datastore

好吧,我说我正在为以下足球俱乐部建模:所有人都是个人.玩家是一个人,因此扩展个人.会员是一个人,因此扩展个人.

超类:

Individual {name, eyeColour}
Run Code Online (Sandbox Code Playgroud)

子类:

Player extends Individual {position}
Member extends Individual {subscription}
Run Code Online (Sandbox Code Playgroud)

汤姆是足球俱乐部的老板:

Individual i = new Individual("Tom", "Blue")
Run Code Online (Sandbox Code Playgroud)

鲍勃和托尼是球员:

Player p1 = new Player("Bob", "Green", "Goalkeeper")
Player p2 = new Player("Tony", "Blue", "Striker")
Run Code Online (Sandbox Code Playgroud)

史蒂夫是会员:

Member m = new Member("Steve", "Brown", 5.00)
Run Code Online (Sandbox Code Playgroud)

个人,玩家和成员都使用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

如果Bob决定成为会员以及玩家怎么办?我想存储是订阅.我无法将鲍勃贬低为个人,然后向成员倾斜.Java不允许这样做.我无法创建新成员并复制Bob的Player对象的所有属性并将其存储回相同的ID - 我将失去他的Position属性.我需要Bob成为数据库中的成员和播放器,但不是对象形式(我不是在多重继承之后)我仍然希望获得(Player.class,"Bob")并拥有一个Player对象或获取(Member.class,"Bob")并有一个Member对象.我不需要同时具有位置和订阅属性的Object.

我也想避免这是数据存储区:

    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现在在名称和eyeColour上有数据重复,这可能导致数据不一致.

有关如何建模的任何想法?

如果汤姆成为一名球员,或者史蒂夫成为会员呢?

pen*_*tur 5

Individual {name, eyeColour}
MemberRole {individual, position}
PlayerRole {individual, subscription}
Run Code Online (Sandbox Code Playgroud)

很明显,继承不适合您的任务.例如,某人可能在两个不同的球队中比赛或者是两个不同球队的成员(并且您的原始结构将不允许拥有多个足球俱乐部).

个人是什么,他们有什么角色,是不同的事情.例如,您不希望某些全局数据库将您的名称,堆栈溢出点,您的婚姻状况和您的职业都存储在同一个Individual表中.

如果鲍勃决定成为会员,鲍勃本身不会改变; 它的角色呢.鲍勃决定成为一名成员仍然是同样优秀的老鲍勃,只是他现在能够做一些他早先被禁止的事情.

PS:您在答案中使用的是" 订阅 "一词.这就是你的播放器 - 订阅.Subscriptions显然不是s的某个特定子集Individual,Subscription是一个完全不同的实体.当然,它应该知道Individual它属于什么,但它不是一个Individual本身.