ここ数週間、できる限り OOP を学ぼうとしてきました。多くのことを学びましたが、これについては確信が持てません。私のクラス階層はどのように見えるべきでしょうか?
2 つのクラスを想像してください。ここにLevel
-class があります。
class Level(object):
def __init__(self, level, exp):
self.level = level
self.exp = exp
@property
def required_exp(self, level=None):
return 80 + 40 * (level or self.level)
def add_exp(self, exp):
self.exp += exp
while self.exp >= self.required_exp:
self.exp -= self.required_exp
self.level += 1
明らかに、他の方法もいくつかありますが、それが基本的な考え方です。
2 番目のクラスは と呼ばれPlayer
ます。、、、、、などname
の属性があります。health
level
experience points
damage
is-a
私がこれまでに学んだこと (SO の誰かが言った) は、継承 ( -relationship ) と属性 ( -relationship )のどちらを使用するべきかわからない場合に、自問自答することですhas-a
。質問は次のとおりです:プレーヤーはレベルですか、それともプレーヤーにはレベルがありますか?
うーん…どちらでもない。プレーヤーは確かにレベルではありません。Level
Player にはレベルがありますが、レベルはクラスと等しくありません。Level
代わりに、プレイヤーにはクラスの属性であるレベルと経験値があります。Player に経験値を追加することもできるので、 から継承するのが理にかなっていLevel
ます。
補足として、ネーミングも私にはまったく意味がありません。次のようなものを用意するのは理にかなっています:Level.increase(self)
レベルを 1 つ上げます。ただし、プレイヤーにとってはPlayer.level_up(self)
、ほとんどの (すべての?) RPG ゲームで使用されているように、 を呼び出す方が理にかなっています。呼び出しPlayer.increase(self)
ても意味がありませんPlayer
。1 ずつ増やすことはできません。レベルを 1 ずつ上げています。繰り返しますが、呼び出しLevel.level_up(self)
もあまり意味がありません...
Level
ですので、あたかもそれをインターフェイスのように使用して、そこから継承Player
(および他のサブクラス) する必要があると思いますが、よくわからないので、とにかく学ぶためにここにいるので、質問することにしました。私は何をすべきか?Level
で使用する最も適切な方法は何Player
ですか?