Подтвердить что ты не робот

Как вызвать метод суперкласса

У меня есть два класса A и B. Класс B переопределяет метод foo класса A. Класс B имеет метод bar, где я хочу вызвать метод foo суперкласса. Каков синтаксис для такого вызова?

class A    
 def foo
   "hello"
 end    
end


class B < A
 def foo
  super + " world"
 end

 def bar
   # how to call the `foo` method of the super class?
   # something similar to
   super.foo
 end
end

Для методов класса я могу вызвать методы в цепочке наследования, явно префикс имени класса. Интересно, есть ли подобная идиома, например, методы.

class P
 def self.x
   "x"
 end
end

class Q < P
 def self.x
   super + " x"
 end

 def self.y
   P.x
 end
end

Edit Мой вариант использования - общий. В конкретном случае я знаю, что могу использовать технику alias. Это обычная функция в Java или С++, поэтому мне интересно узнать, можно ли это сделать без добавления дополнительного кода.

4b9b3361

Ответ 2

Вы можете сделать:

 def bar
   self.class.superclass.instance_method(:foo).bind(self).call
 end

Ответ 3

В этом конкретном случае вы можете просто alias :bar :foo до def foo в class B переименовать старый foo в bar, но, конечно, вы можете псевдонимом любого имени, которое вам нравится, и называть его этим. Этот вопрос имеет несколько альтернативных способов сделать это дальше по дереву наследования.

Ответ 4

Вы можете alias old_foo foo перед тем, как переопределить его, чтобы сохранить старую реализацию под новым именем. (Технически можно взять реализацию суперкласса и привязать его к экземпляру подкласса, но он взломан, а вовсе не идиоматичен и, вероятно, довольно медленный в большинстве реализаций для загрузки.)