在Ruby中调用受保护的超类类方法

时间:2010-12-01 02:37:19

标签: ruby protected superclass class-method

我想从基类中的实例方法调用受保护的超类类方法。

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def bar
    puts "In bar"
    # call A::foo
  end
end

最好的方法是什么?

4 个答案:

答案 0 :(得分:3)

...... 2.67年后......

解决这个问题的一种更简单的方法是使用class_eval

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def bar
    self.class.class_eval { foo }
  end
end

B.new.bar    # prints "In foo"

答案 1 :(得分:1)

覆盖B中的方法,调用super:

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A

  def self.foo
    super
  end

  def bar
    puts "In bar"
    # call A::foo
    self.class.foo        
  end
end

>> B.foo
=> In foo
>> B.new.bar
=> In bar
=> In foo

答案 2 :(得分:0)

到目前为止,我发现的唯一解决方案是在子类中定义一个类方法,该方法调用超类中的类方法。然后我可以在子类的实例方法中调用此方法。

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def self.call_foo
    puts "In call_foo"
    A::foo
  end

  def bar
    puts "In bar"
    self.class.call_foo
  end
end

这真的有必要吗?

答案 3 :(得分:0)

我可能只是把A.foo公之于众。否则send将执行此操作,因为它会绕过访问控制:

A.send(:foo)