2011-12-23 25 views
9

Dire che ho di classe B derivata dalla classe ARubino: richiamare il metodo override di classe genitrice, in classe figlio

E 'possibile richiamare il metodo overrided di A come questo?

class A 
    def method1 
    end 
    def method2 
    end 
end 

class B < A 
    def method1 
    ### invoke method2 of class A is what I want to do here 
    end 
    def method2 
    end 
end 

# non duplicare esattamente a How do I call an overridden parent class method from a child class?, ma ci sembra voler fare la stessa cosa.

+3

Intendevi che B fosse una sottoclasse di A nel codice di esempio? – sepp2k

+1

se b è una sottoclasse di a allora puoi semplicemente chiamare super dal tuo b mehtod. – three

+1

No, ha bisogno di chiamare il metodo di super2 dal metodo del discendente1. Non c'è modo (che io sappia) in Ruby di farlo. –

risposta

16

Presumo qui che B dovrebbe ereditare da A e hai semplicemente fatto un refuso nel tuo codice di esempio. Se questo non è il caso, non c'è modo di fare quello che vuoi.

Altrimenti si può fare quello che vuoi utilizzando la riflessione legandosi metodo method2 esempio A s' al tuo attuale B oggetto e chiamare in questo modo:

class A 
    def method1 
    end 
    def method2 
    end 
end 

class B < A 
    def method1 
    A.instance_method(:method2).bind(self).call 
    end 
    def method2 
    end 
end 

Nota però che non si deve tirare fuori il grande pistole magiche come questa a meno che tu non ne abbia davvero bisogno. Nella maggior parte dei casi, la riprogettazione della gerarchia delle classi in modo che non sia necessario farlo è l'alternativa migliore.

+0

Grazie. Un altro trucco magico nella manica :-) –

+0

+1 avrei postato la stessa cosa. Penso anche che questo dovrebbe essere usato raramente, se non mai. Perché sovrascrivere A # method2 se ne hai ancora bisogno in B? Io uso solo il trucco bind quando provo a risolvere i comportamenti del metodo, ad es. in irb. – Kelvin

9

È possibile creare un sinonimo per il metodo di appartenenza utilizzando alias dichiarazione e chiamarlo dal metodo sovresposta:

class A 
    def method1 
    puts '1' 
    end 
    def method2 
    puts '2' 
    end 
end 

class B < A 
    alias parent_method1 method1 
    alias parent_method2 method2 
    def method1 
    parent_method2 
    end 
    def method2 
    end 
end 

b = B.new 
b.method1 # => 2 
5

La risposta di @ sepp2k è tecnicamente corretto, ma vorrei spiegare perché questa tecnica non è adeguato a mio parere (quindi la domanda è tecnicamente interessante, ma conduce alla meta sbagliato):

  • rubino non consente di chiamare super.method2 nel contesto method1 chiamato in un'istanza di B, becau se è semplicemente sbagliato farlo L'ereditarietà di classe deve essere utilizzata quando le istanze sono specializzazioni della superclasse. Ciò include che normalmente espandi solo il comportamento, chiamando super e facendo qualcosa in aggiunta prima o dopo quella chiamata.
  • Ci sono linguaggi come Java e altri, che consentono di chiamare super per un altro metodo, e che porta a qualcosa di simile al codice spaghetti, ma al modo orientato agli oggetti. Nessuno capisce quando vengono chiamati i metodi, quindi cerca di evitarlo.

Quindi provare a trovare il motivo per cui si desidera modificare la chiamata e risolverlo. Se il tuo method1 in A è sbagliato implementato in B, allora non dovresti creare una sottoclasse.

+0

"Anche quando si pensa che la risposta di @ sepp2k sia corretta" C'è qualche ragione per pensare che non lo sia? – sepp2k

+0

Scusate, volevo esprimere che la vostra risposta è tecnicamente corretta, ma la domanda di per sé ha delle carenze. Lo correggerò, mi dispiace per quel malinteso. – mliebelt

Problemi correlati