Вызов супер супер метода
Можно ли сделать что-то вроде 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
Учитывая это, нарушается один из принципов ООП (инкапсуляция), я очень надеюсь, что это невозможно. Даже случай, когда вы пытаетесь это сделать, говорит о проблеме с вашим дизайном.