2013-10-21 64 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() 

这样你的魔法服务器类具有独特的卡实例来使用。