簡體   English   中英

如果不是多態,我該如何為這些類建模

[英]If not polymorphism, how do I model these classes

好吧,我說我正在為以下足球俱樂部建模:所有人都是個人。 玩家是一個人,因此擴展個人。 會員是一個人,因此擴展個人。

超類:

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數據庫中的同一種(個體)。

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上有數據重復,這可能導致數據不一致。

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

如果湯姆成為一名球員,或者史蒂夫成為會員呢?

Individual {name, eyeColour}
MemberRole {individual, position}
PlayerRole {individual, subscription}

很明顯,繼承不適合您的任務。 例如,某人可能會在兩個不同的球隊中比賽,或者是兩個不同俱樂部的成員(並且您的原始結構將不允許擁有多個足球俱樂部)。

個人是什么,他們有什么角色,是不同的事情。 例如,您不希望某個全局數據庫在同一Individual表中存儲您的姓名,您的stackoverflow點,您的婚姻狀況和您的職業。

如果鮑勃決定成為會員,鮑勃本身不會改變; 它的角色呢。 鮑勃決定成為一名成員仍然是同樣優秀的老鮑勃,只是他現在能夠做一些他早先被禁止的事情。

PS:您在答案中使用的是“ 訂閱 ”一詞。 這就是你的播放器 - 訂閱 Subscription顯然不是Individual的某些特定子集, Subscription是完全不同的實體。 當然,它應該知道Individual所屬的是什么,但它本身並不是Individual

一開始我會把每個人視為Individual ,但你想讓某些人成為PlayerMemberboth 您需要使用Interfaces為此場景建模。 由於我不是Java,我建議做類似於這段代碼的事情:

interface IPlayable {void MakePlayable (string position)};
interface IMembership {void AddMembership (double subscription)};

class Individual implements IPlayable, IMembership{name, eyeColour, IPlayable.MakePlayable(string position), IMembership.AddMembership(double subscription)};

//Usage to make Tom a Player
Individual tom = new Individual("Tom", "Blue");
tom.MakePlayable("GoalKeeper");

//Usage to make Steve a Member
Individual steve = new Individual("Steve", "Brown");
steve.AddMembership(5.00);

//Usage to make Jim both a Player and a Member
Individual jim = new Individual("Jim", "Black");
jim.MakePlayable("Forward");
jim.AddMembership(4.00);

除了實現多個接口場景之外,這里還需要使用接口,因為使用Member類會使個人成為某個俱樂部的永久成員,使用IMembership接口,您可以添加RemoveMembership()方法,這將有助於刪除成員資格Individual將來需要的時候。

嘗試這個...

個人是SuperClass

播放器和成員作為接口

假設Bob是玩家,也是會員。

現在..

鮑勃是個人(即擴展個人

Bob 實現播放器和成員接口 (即Bob播放播放器和成員的角色)

請參閱GAE文檔中的JDO中的實體關系

您可以使用對象類型的字段來建模持久對象之間的關系。 持久對象之間的關系可以被描述為擁有,其中一個對象在沒有另一個對象的情況下不能存在,或者是無主對象,其中兩個對象可以獨立於彼此的關系而存在。 JDO接口的App Engine實現可以模擬自有和非擁有的一對一關系以及一對多關系,包括單向和雙向關系。

我會說你有兩個“擁有”的關系。 PlayerMember都“擁有”的Individual

public class Individual {
    Role role;
    int    position;     //empty for MEMBER,filled for PLAYER_MEMBER and PLAYER
    int    subscription; //empty for PLAYER,filled for PLAYER_MEMBER and MEMBER }

public enum Role {  MEMBER,PLAYER,PLAYER_MEMBER; }

因此,當切換完成后,您只需更改角色並完成缺少的字段。 應該考慮驗證。

創建一個類Indiviual(名稱,eyecolor)並創建所有者,玩家和成員的接口。 您將擁有獨特的個人,並繼續為他們添加功能。 因此,您將擁有所需的表,最后一列將列出不同的實現。

使用接口要比實現多繼承好得多,而java就是這樣做的。 所以,你最好使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM