1

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

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

4 回答 4

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"
于 2012-09-17T04:17:05.203 回答
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
于 2010-12-01T03:52:05.710 回答
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

这真的有必要吗?

于 2010-12-01T02:39:39.927 回答
0

我可能只是让 A.foo 公开。否则send会这样做,因为它绕过了访问控制:

A.send(:foo)
于 2010-12-01T03:27:17.880 回答