過去幾周我一直在儘可能多地學習OOP,並且我學到了很多東西,但我不確定這個,我的類層次結構應該是什麼樣子?玩家是否應該繼承或擁有一個關卡?
試想兩個班,這裏有一個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
顯然它也有一些其他的方法也一樣,但是這是基本的想法。
現在第二類叫做Player
。它有一些屬性,如:name
,health
,level
,experience points
,damage
等
我所學到至今(有人這麼說這)就是問自己一個問題,當我不知道是否使用繼承(is-a
-關係)或屬性(has-a
-關係)。 問題是:球員是一個級別,還是球員有一個級別?
那麼......既不是。 球員肯定不是一個水平,我敢肯定。 而玩家有它的等級,但等級不等於Level
類。 取而代之的是玩家有等級和經驗點,這兩個屬性都是Level
類的屬性。您還可以將經驗值添加到播放器,因此從Level
繼承它是有意義的。
作爲旁註,namings對我來說也沒有任何意義。這是有道理的有這樣的事情:Level.increase(self)
增加一級。 但是,對於玩家來說,在大多數(全部)RPG遊戲中使用Player.level_up(self)
會更有意義。 通話Player.increase(self)
沒有任何意義,您不能將Player
增加1,而是將其級別提高一個。 話又說回來,呼籲Level.level_up(self)
,並不意味着多大意義,要麼...
所以,我認爲我應該用Level
,如果它是一個接口,從它繼承Player
(和其他子類),但我米不確定,所以我決定問你,因爲我在這裏學習反正。 我該怎麼辦?使用Level
和Player
最合適的方式是什麼?
聲音像Player-Level在這種情況下是一種經典的「有-α」關係。你說,「玩家有它的水平,但水平不等於水平類。」這到底意味着什麼? – Santa 2013-05-10 20:28:40
@Santa'Level'級別已經有一個叫'level'的屬性。這個'level'屬性是'Player'也應該有的,它只是一個整數,可以告訴我們玩家的水平。 '玩家'也有經驗積分(exp),這也是'Level'的一個屬性。這就是爲什麼從Level繼承Player的意義,否則我們會調用'Player.level.level'來獲得玩家級別的實際數值。 – 2013-05-10 20:32:43
確實,player.level.level有點尷尬。人們會認爲這個級別應該是一個整數,而不是一個完整的級別。這個「level」代碼寫在哪裏,你可以改變它嗎? – aestrivex 2013-05-10 20:41:57