我想从基类中的实例方法调用受保护的超类类方法。
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
最好的方法是什么?
我想从基类中的实例方法调用受保护的超类类方法。
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
最好的方法是什么?
... 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"
覆盖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
到目前为止,我找到的唯一解决方案是在子类中定义一个类方法,调用超类中的类方法。然后我可以在子类的实例方法中调用这个方法。
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
这真的有必要吗?
我可能只是让 A.foo 公开。否则send
会这样做,因为它绕过了访问控制:
A.send(:foo)