2010-12-01 82 views
1

我想從基類的實例方法調用受保護的超類方法。在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 

這樣做的最好方法是什麼?

回答

1

覆蓋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 
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 

這真的有必要嗎?

0

我可能只是讓A.foo公開。否則send將做到這一點,因爲它繞過訪問控制:

A.send(:foo) 
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"