我想從基類的實例方法調用受保護的超類方法。在Ruby中調用受保護的超類方法
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
這樣做的最好方法是什麼?
我想從基類的實例方法調用受保護的超類方法。在Ruby中調用受保護的超類方法
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
這樣做的最好方法是什麼?
覆蓋B中的方法,調用超:
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)
...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"