我正在尝试使我的程序可扩展。这是一款可以玩多种游戏的通用纸牌游戏。
我有一个通用服务器,我们称之为类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
,Players
,Containers
等版本。我已经考虑只是单独打破服务器,但由于他们共享了大量相同的代码,我想从GenericServer
继承它们。
有关如何解决此问题的任何建议?
答案 0 :(得分:0)
您不需要将所有内容子类化,为什么不只是将通用服务器子类化,然后在魔术服务器中拥有您需要的其他类的实例。
例如:
class MagicServer(GenericServer):
def __init__(self):
self.cards = Cards()
self.players = Players()
self.containers = Containers()
通过这种方式,您的魔术服务器类可以使用唯一的卡片实例。
答案 1 :(得分: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)
等