Вызов метода защищенного класса суперкласса в Ruby - PullRequest
1 голос
/ 01 декабря 2010

Я хочу вызвать защищенный метод класса суперкласса из метода экземпляра в базовом классе.

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

Какой лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 17 сентября 2012

... 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 голос
/ 01 декабря 2010

Переопределить метод в 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
0 голосов
/ 01 декабря 2010

Я бы, наверное, просто обнародовал A.foo. В противном случае send сделает это, поскольку он обходит управление доступом:

A.send(:foo)
0 голосов
/ 01 декабря 2010

Пока что единственное решение, которое я нашел, это определить метод класса в подклассе, который вызывает метод класса в суперклассе.Затем я могу вызвать этот метод в методе экземпляра подкласса.

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

Это действительно необходимо?

...