1

我正在尝试使我的程序可扩展。这是一款可以玩多种游戏的通用纸牌游戏。

我有一个通用服务器,我们称之为 class GenericServer。它导入诸如Cards, Players,Containers等类。

我还有一个特定于游戏的服务器类,它是 的子类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但也有自己的版本Cards,PlayersContainers。我考虑过单独分解服务器,但由于它们共享很多相同的代码,我想子类化他们从GenericServer.

关于如何解决这个问题的任何建议?

4

2 回答 2

0

您不需要对所有内容进行子类化,为什么不只是对通用服务器进行子类化,然后在魔术服务器中拥有您需要的其他类的实例。

例如:

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

这样,您的魔法服务器类就有了一个唯一的 Cards 实例可供使用。

于 2013-10-21T18:15:44.573 回答
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>

这些不必是类变量——它们也可以传递给 init 函数。

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)

等等

于 2013-10-21T18:30:46.100 回答