2010-04-02 14 views
25

Tengo dos clases A y B. La clase B anula el método foo de la clase A. La clase B tiene un método bar en el que deseo llamar al método foo de la superclase. ¿Cuál es la sintaxis para tal llamada?Cómo llamo a un método de clase superior

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 

Para los métodos de clase, puedo llamar a los métodos en la cadena de herencia mediante el prefijo explícito del nombre de clase. Me pregunto si hay un modismo similar por ejemplo, métodos.

class P 
def self.x 
    "x" 
end 
end 

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

def self.y 
    P.x 
end 
end 

Editar Mi caso de uso es general. Para un caso específico, sé que puedo usar la técnica alias. Esta es una característica común en Java o C++, por lo que tengo curiosidad por saber si es posible hacer esto sin agregar código adicional.

+5

duplicado: http: //stackoverflow.com/questions/1251178/calling-another-method-in-super-cla ss-in-ruby –

Respuesta

5

Puede alias old_foo foo antes de redefinirlo para mantener la implementación anterior con un nuevo nombre. (Técnicamente es posible tomar la implementación de una superclase y vincularla a una instancia de una subclase, pero es hacky, nada idiomática y probablemente sea bastante lenta en la mayoría de las implementaciones para arrancar).

13

En este caso particular solo puede alias :bar :foo antes de def foo en class B para cambiar el nombre del antiguo foo al foo, pero por supuesto puede alias a cualquier nombre que desee y llámelo desde allí. This question tiene algunas formas alternativas de hacerlo más abajo en el árbol de herencia.

22

Usted puede hacer:

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

Esta no puede ser la mejor manera de llamar a un método anulado en Ruby, por favor di que no es así. Editar: sí, el comentario en la pregunta vincula a una mejor opción. – Vinnyq12

+3

@ Vinnyq12 Sí, 'alias' es mejor para casos específicos, cuando conoce el método que desea llamar desde la superclase; pero aquí el OP está pidiendo un caso general, sin tener que aliarse todos los métodos de la superclase. –

Cuestiones relacionadas