ここ数週間、できる限り 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の属性があります。healthlevelexperience pointsdamage
is-a私がこれまでに学んだこと (SO の誰かが言った) は、継承 ( -relationship ) と属性 ( -relationship )のどちらを使用するべきかわからない場合に、自問自答することですhas-a。質問は次のとおりです:プレーヤーはレベルですか、それともプレーヤーにはレベルがありますか?
うーん…どちらでもない。プレーヤーは確かにレベルではありません。LevelPlayer にはレベルがありますが、レベルはクラスと等しくありません。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ですか?
