Мне придётся не соглашаться с другими и сказать вам, что это звучит так, как будто вам нужно расширить ваш Player
экземпляр с помощью модуля SpecialPlayer
.Позвольте мне продемонстрировать.Допустим, у вас есть класс игрока:
class Player
attr_accessor :game
def special?
false
end
end
Все игроки будут иметь эти методы.Давайте создадим нового игрока:
player = Player.new
player.game = Game.new
player.special? # false
Теперь предположим, что у вас есть SpecialPlayer
модуль:
module SpecialPlayer
def special?
true
end
def pause_game
game.pause
end
def restart_game
game.restart
end
end
Ваш модуль еще не изменяет поведение Player
, потому что у вас нетсделал что-нибудь для вашего игрока.Итак, давайте расширим наш экземпляр игрока с помощью SpecialPlayer
:
player.extend SpecialPlayer
player.special? # true
player.pause_game # pauses the game
player.restart_game # restarts the game
Прелесть этого в том, что любым другим игрокам в системе не нужно заботиться о том, кто особенный или как они это сделали:
other_player = Player.new
other_player.special? # false
other_player.pause_game # NoMethodError: undefined method `pause_game' for #<Player>
other_player.restart_game # NoMethodError: undefined method `restart_game' for #<Player>
Это также гарантирует, что не любой игрок может быть особенным.Вызов #restart_game
от не специального игрока даже не сработает, поэтому у вас не будет ошибок, когда обычные игроки делают то, что не должны.