2010-04-02 6 views
25

У меня есть два класса 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 

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

+5

Дубликат: HTTP: //stackoverflow.com/questions/1251178/calling-another-method-in-super-cla ss-in-ruby –

ответ

5

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

13

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

22

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

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

Это не лучший способ вызвать переопределенный метод в Ruby, скажите, что это не так. Редактировать: да, комментарий в вопросе ссылки на лучший вариант. – Vinnyq12

+3

@ Vinnyq12 Да, 'alias' лучше для конкретного случая, когда вы знаете метод, который хотите вызвать из суперкласса; но здесь ОП запрашивает общий случай, не требуя псевдонима каждого метода суперкласса. –

Смежные вопросы