2016-12-06 6 views
0

У меня есть проблема, копируя эти два класса:Как скопировать суперкласс в унаследованном класс в Рубине

module NapakalakiGame 
    class Player 

    def initialize(name, level) 
    @name = name 
    @level = level 
    @treasures = Array.new 
    @quests = Array.new 
    end 
... 
end 

И я хочу, чтобы скопировать экземпляр указанного класса здесь:

module NapakalakiGame 
    class CultistPlayer < Player 

    def initialize(player, cultist) 
    super 
    @my_cultist_card = cultist 
    end 
... 
end 

Мне нужно превратить Игрока в культиста, поэтому мне нужно скопировать все его атрибуты. Конструктор CultistPlayer получает Игрока, который хочет быть преобразованным, и одну культистскую карту.

Например, если у меня есть игрок с именем John, у которого есть уровень 30, 5 видов сокровищ и 20 завершенных квестов, когда он становится культистом, мне нужно сохранить все это.

ответ

1

Вы не можете сделать так, потому что ваш метод Player#new не принимает одинаковые аргументы и не принимает игрока в качестве аргумента.

Но вы можете изменить метод initalize и super вызова в подклассе, чтобы сделать его работу:

Изменение player.rb:

attr_reader :name, :level, :treasures, :quests # if you don't have getter methods 

def initialize(name, level, treasures = nil, quests = nil) 
    @name  = name 
    @level  = level 
    @treasures = treasures || [] 
    @quests = quests || [] 
end 

и cultist_player.rb:

def initialize(player, cultist) 
    super(player.name, player.level, player.treasures, player.quests) 
    @my_cultist_card = cultist 
end 
+0

В C++ ... Вы можете использовать именно: Player (Const плеер & р) {....} Есть ли способ, как это в рубине? – Bechma

0

Я не уверен, что «преобразование» - лучший архитектурный подход. Но если вам это действительно нужно, вы можете попробовать написать так:

class CultistPlayer < Player 
def initialize(player, cultist) 
    copy_variables(player) 
    @my_cultist_card = cultist 
end 

def copy_variables player 
    player.instance_variables.each do |name| 
    instance_variable_set(name, player.instance_variable_get(name)) 
    end 
end 
end 

#usage: 
simple_player = Player.new('Ben', 10) 
cultist = CultistPlayer.new(simple_player, 'some cultist card') 

 Смежные вопросы

  • Нет связанных вопросов^_^