Есть ли шаблон проектирования для этого: скрыть определенные методы от определенных классов - PullRequest
0 голосов
/ 06 октября 2010

Я пишу симуляцию на Python для игры в кости и пытаюсь найти лучший способ справиться со следующей ситуацией объектно-ориентированным способом.

У меня есть класс Dice, который обрабатывает бросокигральные кости и сообщающие вещи о кости.Методы этого класса включают метод roll(), который изменяет значения костей, и различные методы отчетности, описывающие состояние костей, такие как have_n_of_a_kind(), is_scoring_combination() и get_roll_value().

.два класса, которые используют этот класс Dice.Игроку, контролируемому непосредственно человеком, не доверяют всегда делать легальные ходы.Существует также класс Turn, который обеспечивает соблюдение правил игры.

Итак, класс Player и Turn должен иметь возможность запрашивать Dice о его значениях, вызывая методы, описывающие состояние, но Playerнельзя позволить напрямую вызывать метод roll(), потому что игрок-игрок может бросить, когда это не предполагается.

Есть ли хороший способ для меня позволить классу Turn вызывать объект Dice из roll() метод, но не позволяет игроку сделать это?

1 Ответ

1 голос
/ 06 октября 2010

Попросите Player попросить Turn бросить, например, позвонив. turn.roll_dice(). Turn может затем решить, следует ли roll кости или, например, поднять NotYourTurnError.

Вы не можете запретить классу Player напрямую вызывать die.roll(), хотя вы можете сделать roll приватным, переименовав его __roll. Однако, поскольку я предполагаю, что игрок управляет die через некоторый пользовательский интерфейс (G?), Вы можете просто не включать способ сказать die - roll в указанном интерфейсе.

В общем, вы не можете скрыть подобные методы от произвольного кода Python с какой-либо степенью безопасности; Python настолько мощен, что вы почти наверняка сможете найти способ обойти защиту. Вместо этого вы делаете их защищенными (_foo) или частными (__foo) и предполагаете, что люди, которые их называют, знают, что они делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...