2013-10-21 110 views
1

我試圖使我的程序可擴展。這是一款可以玩多種類型遊戲的通用紙牌遊戲。Python中的並行子類?在子類中使用子類

我有一個通用服務器,我們稱之爲類GenericServer。它進口類,如CardsPlayersContainers

我也有一個遊戲特定的服務器類是GenericServer一個子類,我們稱之爲一個MagicServer

我想要做的是有MagicServer加載遊戲特定版本的GenericServer導入的類。

class GenericServer(object): 
    # imports Cards(object), Players(object), Containers(object) 

class MagicServer(GenericServer): 
    # imports MagicCards(Cards), MagicPlayers(Players), MagicContainers(Containers) 

的計劃是有多個遊戲特定的服務器都作爲GenericServer子類,但也有他們自己的版本的CardsPlayersContainers等我考慮過剛剛突破服務器單獨聯繫,但因爲它們共享我想從GenericServer中繼承這些代碼。

關於如何解決這個問題的任何建議?

+0

你能澄清你的問題是什麼?您已經很好地描述了您的設置,但對於您嘗試解決的問題的確切性質我有點不確定。你是否想要減少代碼重複?自動使'MagicCards','MagicPlayers'等自動從相應的子類繼承?還有別的嗎? – Michael0x2a

+0

@ Michael0x2a在我看來,OP希望保證FooServer只能使用FooCards,FooPlayers,FooContainers等。,同時保證BarServer只能使用BarCards,BarPlayers,BarContainers等。 – pyon

+0

@EduardoLeónYep,這就是我期待的。 – Malvok

回答

0

是服務器是否生成卡片,播放器等或僅供應/使用它們?如果第一個...... ,那麼服務器類不需要知道使用什麼樣的卡,播放器等。其他人會創建它並將其傳遞給服務器,服務器將使用標準卡(例如)API使用它。這可能會更容易維護和構建。

但是,如果第二...那麼你可以用類變量做到這一點:

class Cards(object): 
    pass 

class MagicCards(Cards): 
    pass 

class GenericServer(object): 
    cards = Cards 

    def createCards(self): 
     return self.cards() 

class MagicServer(GenericServer): 
    cards = MagicCards 

gs = GenericServer() 
ms = MagicServer() 

gs.createCards() 
<__main__.Cards at 0x3df6048> 
ms.createCards() 
<__main__.MagicCards at 0x3df6080> 

這些並不必須是類變量 - 它們也可以傳遞到初始化函數。

class GenericServer2(object): 
    def __init__(self, cards): 
     self.cards = cards 

    def createCards(self): 
     return self.cards() 

gs2 = GenericServer2(Cards) 
ms2 = GenericServer2(MagicCards) 
gs2.createCards() 
<__main__.Cards at 0x3ee5a58> 
ms2.createCards() 
<__main__.MagicCards at 0x3ee5470> 

要使用哪一個?這並不重要。如果您實際上對GenericServer進行了很多子類化,第一種可能更直接。如果你只是使用子類來容易區分的類,二是更容易,你可以用工廠函數模擬以前的行爲:

def MagicServer2(): 
    return GenericServer2(MagicCards) 

+0

這在我的程序中效果很好。謝謝。 – Malvok

0

你不需要子類化所有東西,爲什麼不只是子類化通用服務器,然後在魔法服務器中有其他類的實例。

例如:

class MagicServer(GenericServer): 
    def __init__(self): 
     self.cards = Cards() 
     self.players = Players() 
     self.containers = Containers() 

這樣你的魔法服務器類具有獨特的卡實例來使用。