2010-12-01 4 views

ответ

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"