Как вызвать метод суперкласса
У меня есть два класса 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 или С++, поэтому мне интересно узнать, можно ли это сделать без добавления дополнительного кода.
Ответы
Ответ 1
В Ruby 2.2 вы можете использовать Method#super_method
сейчас
Например:
class B < A
def foo
super + " world"
end
def bar
method(:foo).super_method.call
end
end
Ссылка: https://bugs.ruby-lang.org/issues/9781#change-48164 и https://www.ruby-forum.com/topic/5356938
Ответ 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
перед тем, как переопределить его, чтобы сохранить старую реализацию под новым именем. (Технически можно взять реализацию суперкласса и привязать его к экземпляру подкласса, но он взломан, а вовсе не идиоматичен и, вероятно, довольно медленный в большинстве реализаций для загрузки.)