(在红宝石公司工作)
首先,我提前道歉。我不是一个训练有素的程序员,我只是凭借便利和不断变化的世界来实现它。我需要做的是编程,我厌倦了等待别人为我编程。因此,我一路上漏掉了一些基本概念,当我问这些问题时,我有时会因后果而出丑。
假设我想在类中定义一个物种/工作关系。我想定义一个超类“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
让他们每个人获得适当数量的腿,以及在儿童班中分配的任何特殊特征。worker/queen/fighter分类将由名称空间绑定,以便实际调用为:
ant1 = AntBlack::Worker.new
ant2 = AntRed::Worker.new
ant3 = AntRed::Queen.new
等。
然后,我希望能够使用以下方法检查单个蚂蚁的腿部数量:
ant1.legs #=> 6
我可能会绕着胳膊肘去摸大拇指。如果是这样的话,请随时为实现相同结果的方法提供其他建议,我将非常感谢您的见解。
///updated re:响应///
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
最佳答案
定义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类的方式是,将legs存储为class level instance variable。