2010-04-02 16 views
25

Ho due classi A e B. La classe B ha la priorità sul metodo foo della classe A. La classe B ha un metodo bar in cui voglio chiamare il metodo foo della super classe. Qual è la sintassi per tale chiamata?Come si chiama un metodo di super classe

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 

Per i metodi di classe, è possibile richiamare i metodi sulla catena di ereditarietà precedendo esplicitamente il nome della classe. Mi chiedo se esiste un linguaggio simile per i metodi di esempio.

class P 
def self.x 
    "x" 
end 
end 

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

def self.y 
    P.x 
end 
end 

Modifica mio caso d'uso è generale. Per un caso specifico so che posso usare la tecnica alias. Questa è una caratteristica comune in Java o C++, quindi sono curioso di sapere se è possibile farlo senza aggiungere altro codice.

+5

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

risposta

5

È possibile effettuare il alias old_foo foo prima di ridefinirlo per mantenere la vecchia implementazione in giro con un nuovo nome. (Tecnicamente è possibile prendere un'implementazione di una superclasse e collegarla a un'istanza di una sottoclasse, ma è hacky, per niente idiomatica e probabilmente piuttosto lenta nella maggior parte delle implementazioni per l'avvio.)

13

In questo caso particolare si può solo alias :bar :foo prima di def foo in class B per rinominare il vecchio foo a bar, ma ovviamente è possibile creare un alias con qualsiasi nome e chiamarlo da quello. This question ha alcuni modi alternativi per farlo più in basso nell'albero dell'ereditarietà.

22

Si può fare:

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

Questo non può essere il modo migliore per chiamare un metodo sottoposto a override in Ruby, per favore non è così. Modifica: sì il commento nella domanda si collega a un'opzione migliore. – Vinnyq12

+3

@ Vinnyq12 Sì, 'alias' è migliore per un caso specifico, quando si conosce il metodo che si desidera chiamare dalla superclasse; ma qui l'OP sta chiedendo un caso generale, senza dover alias ogni metodo di superclasse. –

Problemi correlati