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

Max*_*ans 3 ruby inheritance class parent-child

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

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

对我来说,直觉上,这看起来像这样:

class BlackAnt
  @legs = 6
end

class Worker < BlackAnt
  @jaws = 'small'
end
Run Code Online (Sandbox Code Playgroud)

但如果我再尝试

ant1 = Worker.new
puts ant1.legs
Run Code Online (Sandbox Code Playgroud)

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

class BlackAnt
  attr_accessor :legs
  @legs = 6
end
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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

我觉得我在这件事上有点傻,毫无疑问,这个回答会让我诅咒我发现咖啡因驱动的通宵的那一天。我需要做的是安排事情,以便我可以创建这样的对象:

ant1 = Worker.new
ant2 = Queen.new
ant3 = Fighter.new
Run Code Online (Sandbox Code Playgroud)

并让他们每个人获得适当数量的腿,以及在儿童班中分配的任何特殊特征。worker/queen/fighter 分类将受命名空间的约束,因此实际调用将是:

ant1 = AntBlack::Worker.new
ant2 = AntRed::Worker.new
ant3 = AntRed::Queen.new
Run Code Online (Sandbox Code Playgroud)

等等。

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

ant1.legs #=> 6
Run Code Online (Sandbox Code Playgroud)

我可能会绕着我的肘部摸到我的拇指。如果是这样,请随时为实现相同结果的方法提供替代建议,我将不胜感激。

///更新回复:响应///

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

class Worker < AntRed
  @strength = 1
end
Run Code Online (Sandbox Code Playgroud)

结果:

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

cba*_*com 5

如下定义你的 BlackAnt 类:

class BlackAnt
  attr_accessor :legs

  def initialize
    @legs = 6
  end
end
Run Code Online (Sandbox Code Playgroud)

你的 Worker 类如下:

class Worker < BlackAnt
  attr_accessor :strength

  def initialize
    super

    @strength = 1
  end
end
Run Code Online (Sandbox Code Playgroud)

您当前定义 BlackAnt 类的方式是将腿存储为类级别实例变量

  • 是的,它现在可以工作,无论是未初始化还是初始化。我太累了,想知道为什么未初始化的版本以前不起作用(五块钱“我在重新加载之前忘记按 ctrl+s”),所以我会非常感谢你,然后像喝醉的河马一样睡着. (3认同)