将父类初始化变量传递给子类的实例

时间:2012-12-23 03:48:58

标签: ruby class inheritance parent-child

(在Ruby工作) 首先,我提前道歉。我不是训练的程序员,我只是通过方便和不断变化的世界来实现它。我需要做的是编程,我厌倦了等待别人为我编程。因此,我一路上都错过了一些基本概念,当我提出这些问题时,我有时会因此而愚弄自己。

假设我想在课堂上定义一个物种/工作关系。我想定义一个超类“BlackAnt”,并有子类“Worker”“Fighter”和“Queen”

对我来说,直观地说,这看起来像这样:

class BlackAnt
  @legs = 6
end

class Worker < BlackAnt
  @jaws = 'small'
end

但如果我再尝试

ant1 = Worker.new
puts ant1.legs

我收到错误。如果我将类BlackAnt修改为:

class BlackAnt
  attr_accessor :legs
  @legs = 6
end

ant1.legs返回'nil'

我已尝试过此处列出的方法:http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

这允许Worker.legs返回'6',但是......唉:

ant1 = Worker.new
Worker.legs => '6'
ant1.legs => 'nil'

猜测,每次生成新子项时,这些父变量的值都不会被初始化。

我觉得我对此有些愚蠢,而且在我发现咖啡因驱动的全能者的那一天,回复无疑会让我受诅咒。我需要做的是安排事情,以便我可以像这样创建对象:

ant1 = Worker.new
ant2 = Queen.new
ant3 = Fighter.new

并让他们各自获得适当数量的腿,以及在儿童班中分配的任何特殊特征。工作人员/女王/战士分类将受命名空间的约束,以便实际调用将是:

ant1 = AntBlack::Worker.new
ant2 = AntRed::Worker.new
ant3 = AntRed::Queen.new

我希望能够使用以下方法检查单个蚂蚁的腿数:

ant1.legs #=> 6

我可能会绕着肘部走到我的拇指上。如果是这样,请随时提供替代建议,以获得相同的结果,我将非常感谢这些见解。

///更新了re:response ///

class AntRed
  attr_accessor :legs
  def initialize
    @legs = 6
  end
end

class Worker < AntRed
  @strength = 1
end

结果:

irb(main):009:0> ant1 = Worker.new
#=> #<Worker:0x87616ac @strength=1>
irb(main):010:0> ant1.legs
#=> nil

3 个答案:

答案 0 :(得分:4)

按如下方式定义BlackAnt类:

class BlackAnt
  attr_accessor :legs

  def initialize
    @legs = 6
  end
end

你的工人类如下:

class Worker < BlackAnt
  attr_accessor :strength

  def initialize
    super

    @strength = 1
  end
end

您目前定义BlackAnt类的方式是将腿存储为class level instance variable

答案 1 :(得分:0)

  

猜测,那些父变量的值不存在   每次生成一个新孩子时都会初始化。

在Ruby实例中,变量属于单个对象。从我的答案开始看第7点)

  

解决你的问题,如果它们是变量&#34;

Why are symbols in Ruby not thought of as a type of variable?

中的


我不明白为什么你会irb(main):010:0> ant1.legs #=> nil。对我来说它是有效的(至少作为脚本)。

class AntRed
  attr_accessor :legs
  def initialize
    @legs = 6
  end
end

class Worker < AntRed
end

ant1 = Worker.new
print 'ant1.legs : '; puts ant1.legs

执行:

$ ruby -w test.rb 
ant1.legs : 6

答案 2 :(得分:0)

你的意思是你想要一个已经初始化的类的实例varieble!

所以你可以这样做:

class BlackAnt
  attr_accessor :legs
  @legs = 6

  def initialize
    @legs = self.class.instance_variable_get(:@legs)
  end
end

newObj = BlackAnt.new
newObj.legs