在父方法中获取子常量 - Ruby

时间:2012-03-30 19:58:45

标签: ruby inheritance

在Ruby中,当我通过孩子调用父母的方法时,是否有可能让孩子保持不变?

示例:

class Tester
  class Parent

    def go
      EWOCK
    end
  end

  class Child < Parent
    EWOCK = "EWOCKS rule"

  end
end

然后拨打Tester::Child.new.go并希望“EWOCKS规则”回来?

[编辑3/31]

哇,我真的很抱歉。我完全搞砸了解释。

  • 父母应该是Child,Child应该从base继承。
  • 电话应该是Child,而不是Parent

再次,许多道歉并感谢那些回复试图理解我可怕的写作的人。

现在已修好。

2 个答案:

答案 0 :(得分:42)

编辑:这个答案是正确的,尽管Wayne是解决这个问题的更多红宝石方法。

是的。

您的实现将工作,因为父级尝试在本地解析EWOK。父级没有定义EWOK。但是,您可以告诉Ruby专门查看调用该方法的实际实例的类,以获取EWOK。

工作:

class Parent
  def go
    self.class::EWOK
  end
end

class Child < Parent
  EWOK = "Ewoks Rule"
end

class Child2 < Parent
  EWOK = "Ewoks are ok, I guess"
end

bob = Child.new
bob.go  # => "Ewoks Rule"

joe = Child2.new
joe.go  # => "Ewoks are ok, I guess"

这里发生了什么: 在Parent的'go'中,“self”将引用实际被调用的'go'对象的实例。即,鲍勃(孩子)或乔(孩子2)。 self.class获取该实例的实际类 - 在bob的情况下为Child,在joe的情况下为Child2。 然后,self.class :: EWOK将从正确的类中检索EWOK。

答案 1 :(得分:12)

要使父类能够访问子类中定义的常量,请将该常量包装在方法中。然后适用正常的继承规则:

class Parent

  def ewok
    "Ewoks are lame"
  end

end

class Child < Parent

  def ewok
    "Ewoks rule"
  end

end

p Parent.new.ewok    # Ewoks are lame
p Child.new.ewok     # Ewoks rule

如果常量很难初始化(例如,一个大的哈希),则将其定义为常量,但通过方法访问它:

class Parent

  EWOK = {
    # Enormous hash...
  }

  def ewok
    EWOK
  end

end