Ruby 将父类初始化变量传递给子类的实例
(在Ruby中工作) 首先,我先道歉。我不是一个受过训练的程序员,我只是凭借着便利和不断变化的世界才来到这里的。我需要做的是编程,我厌倦了等待别人为我编程。因此,我错过了一些基本的概念,当我问这些问题时,我有时会因此而出丑 假设我想在类中定义一个物种/工作关系。我想定义一个超类“BlackAnt”,并有子类“Worker”、“Fighter”和“Queen” 在我看来,直觉上,这看起来像这样:Ruby 将父类初始化变量传递给子类的实例,ruby,class,inheritance,parent-child,Ruby,Class,Inheritance,Parent Child,(在Ruby中工作) 首先,我先道歉。我不是一个受过训练的程序员,我只是凭借着便利和不断变化的世界才来到这里的。我需要做的是编程,我厌倦了等待别人为我编程。因此,我错过了一些基本的概念,当我问这些问题时,我有时会因此而出丑 假设我想在类中定义一个物种/工作关系。我想定义一个超类“BlackAnt”,并有子类“Worker”、“Fighter”和“Queen” 在我看来,直觉上,这看起来像这样: class BlackAnt @legs = 6 end class Worker < B
class BlackAnt
@legs = 6
end
class Worker < BlackAnt
@jaws = 'small'
end
class BlackAnt
attr_accessor :legs
@legs = 6
def initialize
@legs = self.class.instance_variable_get(:@legs)
end
end
newObj = BlackAnt.new
newObj.legs
我犯了一个错误。如果我将BlackAnt类修改为:
class BlackAnt
attr_accessor :legs
@legs = 6
end
ant1.legs返回“nil”
我尝试过这里概述的方法:
这允许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
类中的
属性存取器:腿
def初始化
@支腿=6
结束
结束
工人阶级
@强度=1
结束
结果:
irb(main):009:0> ant1 = Worker.new
#=> #<Worker:0x87616ac @strength=1>
irb(main):010:0> ant1.legs
#=> nil
irb(main):009:0>ant1=Worker.new
#=> #
irb(主):010:0>1.0
#=>零
如下定义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
您的工人阶级如下所示:
class BlackAnt
attr_accessor :legs
def initialize
@legs = 6
end
end
class Worker < BlackAnt
attr_accessor :strength
def initialize
super
@strength = 1
end
end
class Worker
按照当前定义BlackAnt类的方式,您将腿存储为一个
据猜测,这些父变量的值没有得到验证
每次生成新子级时初始化
在Ruby中,实例变量属于单个对象。请看我的答案中的第7点
解决“如果它们是变量,则为真”
在
我不明白你为什么会得到
irb(main):010:0>ant1.legs#=>nil
。对我来说,它是有效的(至少作为脚本)
您的意思是您想要一个已初始化的类实例varieble 所以你可以这样做:
class BlackAnt
@legs = 6
end
class Worker < BlackAnt
@jaws = 'small'
end
class BlackAnt
attr_accessor :legs
@legs = 6
def initialize
@legs = self.class.instance_variable_get(:@legs)
end
end
newObj = BlackAnt.new
newObj.legs
谢谢你的回复——不过,这似乎不是解决方案。无法在此处放置代码块,因此我将相应地编辑问题。如果您也向Worker类添加了initialize方法,则需要记住调用super。我编辑我的答案是为了告诉你我的意思,以防出现问题。是的,它现在正在工作,未初始化和初始化。我太累了,不知道为什么未初始化的版本以前不起作用(在“我重新加载它之前忘记按ctrl+s键了”上花了五块钱),所以我会非常感谢你,然后像喝醉的河马一样睡着。我认为这是一个丑陋的方法