如何将superclass复制到Ruby中继承的class
How to copy the super class into the inherited class in Ruby
我在复制这两个 class 时遇到问题:
module NapakalakiGame
class Player
def initialize(name, level)
@name = name
@level = level
@treasures = Array.new
@quests = Array.new
end
...
end
我想在这里复制上面class的一个实例:
module NapakalakiGame
class CultistPlayer < Player
def initialize(player, cultist)
super
@my_cultist_card = cultist
end
...
end
我需要将Player变成一个邪教徒,所以我需要复制他所有的属性。 CultistPlayer 的构造函数接收要变形的 Player 和一张邪教卡。
例如,如果我有一个叫约翰的玩家,他有 30 级、5 种宝物和 20 个已完成的任务,当他成为邪教徒时,我需要全部保留。
你不能那样做,因为你的 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
我不确定 "transform" 是最好的架构方法。但是如果你真的需要它你可以尝试这样写:
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')
我在复制这两个 class 时遇到问题:
module NapakalakiGame
class Player
def initialize(name, level)
@name = name
@level = level
@treasures = Array.new
@quests = Array.new
end
...
end
我想在这里复制上面class的一个实例:
module NapakalakiGame
class CultistPlayer < Player
def initialize(player, cultist)
super
@my_cultist_card = cultist
end
...
end
我需要将Player变成一个邪教徒,所以我需要复制他所有的属性。 CultistPlayer 的构造函数接收要变形的 Player 和一张邪教卡。
例如,如果我有一个叫约翰的玩家,他有 30 级、5 种宝物和 20 个已完成的任务,当他成为邪教徒时,我需要全部保留。
你不能那样做,因为你的 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
我不确定 "transform" 是最好的架构方法。但是如果你真的需要它你可以尝试这样写:
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')