Вызов супер супер метода

Можно ли сделать что-то вроде super.super в методе overriden? То есть, чтобы обойти прямой родительский супер и вызвать "grandparent's" super?

Ответы

Ответ 1

Это не рекомендуется, но то, что вы хотите, возможно так:

grandparent = self.class.superclass.superclass
meth = grandparent.instance_method(:the_method)
meth.bind(self).call

Это работает, сначала получив класс grandparent, затем называя instance_method на нем, чтобы получить UnboundMethod, представляющий версию grandparent the_method. Затем он использует UnboundMethod#bind и Method#call для вызова метода grandparent для текущего объекта.

Ответ 2

вы можете изменить аргументы метода, чтобы разрешить какой-либо необязательный параметр "передать родительскому". в суперкласс вашего ребенка, проверьте этот параметр, и если да, вызовите super из этого метода и верните, в противном случае разрешите выполнение продолжить.

class Grandparent; def method_name(opts={}); puts "Grandparent called."; end; end
class Parent < Grandparent
def method_name(opts={})
  return super if opts[:grandparent]
  # do stuff otherwise...
  puts "Parent called."
end
end
class Child < Parent
def method_name(opts={})
  super(:grandparent=>true)
end
end

ruby-1.9.2-p0 > Child.new.method_name
Grandparent called.
  => nil   

В противном случае я согласен с @Femaref, просто b/c что-то возможно, это не значит, что это хорошая идея. передумайте свой дизайн, если считаете, что это необходимо.

Ответ 3

Учитывая это, нарушается один из принципов ООП (инкапсуляция), я очень надеюсь, что это невозможно. Даже случай, когда вы пытаетесь это сделать, говорит о проблеме с вашим дизайном.