我想从基类中的实例方法调用受保护的超类类方法。
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
最好的方法是什么?
答案 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)