Вызов супер метод супер - PullRequest
       3

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

15 голосов
/ 29 декабря 2010

Можно ли сделать что-то вроде super.super в переопределенном методе? То есть, чтобы обойти супер родителя и назвать «дедушкин» супер?

Ответы [ 3 ]

22 голосов
/ 29 декабря 2010

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

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

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

0 голосов
/ 29 декабря 2010

вы можете изменить аргументы метода, чтобы разрешить какой-то необязательный параметр 'pass to parent'.в суперклассе вашего ребенка проверьте этот параметр и, если так, вызовите 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что-то возможно не значит, что это хорошая идея.Пересмотрите свой дизайн, если считаете, что это необходимо.

0 голосов
/ 29 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...