2010-10-05 55 views
0

我正在Python中編寫一個模擬骰子游戲的模擬,並試圖找到以面向對象的方式處理以下情況的最佳方法。是否有這樣的設計模式:隱藏某些類的某些方法

我有一個Dice類來處理擲骰子和報告有關骰子的事情。此類的方法包括修改骰子值的roll()方法以及描述骰子狀態的各種報告方法,例如have_n_of_a_kind(),is_scoring_combination()get_roll_value()

有兩個類使用這個Dice類。玩家由人直接控制,不可信任始終採取合法行動。還有一個Turn類強制遊戲規則。

因此,玩家和轉動類都需要能夠通過調用描述方法的狀態向骰子詢問其值,但不允許玩家直接調用roll()方法,因爲人類玩家可能會滾動當它不應該。

有沒有一種方法可以讓Turn類調用Dice對象的roll()方法,但不允許玩家這樣做?

回答

1

PlayerTurn通過呼叫turn.roll_dice()Turn然後可以決定是否roll骰子或例如提高NotYourTurnError

你不能阻止Player類直接調用die.roll(),雖然你可以通過重命名__roll使roll私有。但是,由於我假設玩家通過某種(G?)UI控制die,因此您可以簡單地不包含任何在所述界面中告知dieroll的方式。

一般來說,您不能從任意Python代碼中以任何程度的安全性隱藏這樣的方法; Python非常強大,幾乎可以肯定能夠找到解決方法。相反,你可以保護他們(_foo)或私人(__foo),並假定給他們打電話的人知道他們在做什麼。

+3

單引號和雙引號不直接對應於其他語言中的'protected'和'private'輔助修飾符,因爲這篇文章似乎暗示了這一點。 pythonic要做的事情是考慮使用單獨的下劃線('_foo')來表示*〜私有性〜但是請注意,使用雙重下劃線(即使它的名字有些混亂),Python不會以任何方式強制隱私),所以通常不建議使用'__foo'。 – ChristopheD 2010-10-05 21:58:44

+0

ChristopheD在這裏完全正確。這是不言而喻的,只要你嘗試在python中進行任何反射編程,你就會被雙下劃線名稱修改燒燬。如果這對你沒有任何意義,不要擔心,但不要使用__foo。 – 2010-10-05 22:08:51

相關問題