1

プログラムを拡張可能にしようとしています。これは、複数の種類のゲームをプレイする一般的なカード ゲーム用です。

私は汎用サーバーを持っています。これを class と呼びましょうGenericServer。、、、などCardsのクラスをインポートします。PlayersContainers

のサブクラスであるゲーム固有のサーバー クラスもあります。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、などを使用することも考えています。サーバーを個別に分割することも検討しましたが、同じコードの多くを共有しているため、サブクラス化したいと考えています。それらから。PlayersContainersGenericServer

これを解決する方法について何か提案はありますか?

4

2 に答える 2

0

サーバーはカード、プレーヤーなどを生成していますか、それとも単にそれらを提供/使用していますか? 最初の場合...サーバークラスは、使用されているカード、プレーヤーなどの種類を知る必要はありません。他の何かがそれを作成し、サーバーに渡します。サーバーは、標準の Card (eg) API を使用してそれを使用します。これは、保守と構築がはるかに簡単になる場合があります。

しかし、2番目の場合...クラス変数でそれを行うことができます:

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 を実際にサブクラス化している場合は、最初の方法の方がおそらく簡単です。サブクラス化を使用してクラスを簡単に区別するだけの場合は、2 番目の方が簡単で、ファクトリ関数を使用して以前の動作をシミュレートできます。

def MagicServer2():
    return GenericServer2(MagicCards)

于 2013-10-21T18:30:46.100 に答える
0

すべてをサブクラス化する必要はありません。ジェネリックサーバーをサブクラス化してから、必要な他のクラスのインスタンスをマジックサーバー内に配置してください。

例えば:

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

このようにして、マジック サーバー クラスは、使用する一意の Cards インスタンスを持ちます。

于 2013-10-21T18:15:44.573 に答える