(在Ruby中工作) 首先,我提前道歉。我不是一个训练有素的程序员,我只是靠着方便和不断变化的世界来达到目的。我需要做的事情包括编程,我厌倦了等待别人为我编程。因此,我一路上错过了一些基本概念,当我提出这些问题时,我有时会因此而自欺欺人。将父类初始化变量传递给子类的实例
比方说,我想要定义一个类别中的物种/工作关系。我想定义一个超类“BlackAnt”,并有子类“工人”,“战斗机”和“皇后”
对我来说,直觉,这看起来是这样的:
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返回 '零'
我试着概括的方法在这里: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
我可能会绕着我的胳膊肘到达我的拇指。如果是这样,随时提供替代方法来达到同样的结果,我将非常感谢这些见解。
///更新重:响应///
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
感谢您的答复 - 这不,但是,似乎是分辨率。不能在这里放置代码块,所以我会相应地编辑问题。 –
如果您还为Worker类添加了初始化方法,则需要记得调用super。我编辑了我的答案,告诉你我的意思是否是这个问题。 – cbascom
对,它现在正在工作,都未初始化和初始化。我太累了,不知道为什么这个未初始化的版本以前没有工作(在我重新加载之前,我忘记点击ctrl + s的五块钱),所以我只会非常感谢你,并像醉酒的河马一样入睡。 。 –