だから私はゲームを作っています、そしてすべてのオブジェクトはこのようなもののように見える1つのGameObjectクラスから派生しています。
class GameObject(pygame.sprite.DirtySprite):
actions = dict()
def __init__(self):
pygame.sprite.DirtySprite.__init__(self)
self.rect = None
self.state = None
def update(self):
if callable(self.__class__.actions[self.state]):
#If this key has a function for its element...
self.__class__.actions[self.state](self)
今、私は継承に関する別の問題に直面しています。以下のクラスと、それから派生した2つのクラスを観察してください。
class Bullet(gameobject.GameObject):
FRAME = pygame.Rect(23, 5, 5, 5)
STATES = config.Enum('IDLE', 'FIRED', 'MOVING', 'RESET')
def __init__(self):
gameobject.GameObject.__init__(self)
self.image = config.SPRITES.subsurface(self.__class__.FRAME)
self.rect = self.__class__.START_POS.copy()
self.state = self.__class__.STATES.IDLE
actions = {
STATES.IDLE : None ,
STATES.FIRED : start_moving,
STATES.MOVING : move ,
STATES.RESET : reset ,
}
class ShipBullet(bullet.Bullet):
SPEED = -8
START_POS = pygame.Rect('something')
def __init__(self):
super(self.__class__, self).__init__()
self.add(ingame.PLAYER)
class EnemyBullet(bullet.Bullet):
SPEED = 2
START_POS = pygame.Rect('something else')
def __init__(self):
super(self.__class__, self).__init__()
self.add(ingame.ENEMIES)
Bullet.actions
を除く(静的メンバー、気を付けてください)のすべての要素はNone
、内に保持されている関数ですBullet
。 Bullet
単独で作成することを意図したものではありません。これがC++の場合、抽象クラスになります。つまり、Bullet
サブクラスはすべてのフレームを検索しBullet.actions
て、状態(移動しているのか、撃たれたばかりなのかなど)に応じて、次に何をするかを決定します。ただし、の要素はBullet.actions
独自のBullet
メソッドであるため、そのサブクラスは、独自の拡張バージョン(親メソッドを呼び出す)ではなく、それらを実行しています。メモリ使用量の理由から、このコールバックのdictを複製する必要はありません。だから、私はこれを尋ねます。サブクラスのインスタンスに、コールバックメソッドでいっぱいの親ディクショナリを調べて、存在する場合は独自のバージョンを実行し、存在しない場合は親のバージョンを実行するにはどうすればよいですか?