2015-06-26 14 views
5

Ho diversi metodi che hanno una logica condizionale simile e penso che sia ragionevole usarli.Chiamata super nel contesto di questo metodo chiamante

class A 
    def parent1(val) 
    puts "parent1 A #{val}" 
    end 

    def parent2(val) 
    puts "parent2 A #{val}" 
    end 
end 

class B < A 
    def parent1(val) 
    if val 
     puts "foo" 
    else 
     super 
    end 
    end 

    def parent2(val) 
    if val 
     puts "bar" 
    else 
     super 
    end 
    end 
end 

E 'possibile creare un #puts_or_super che sarebbe in grado di chiamare super del suo chiamante? (B#parent1 o B#parent2) Così il codice sarà simile a questa:

def parent1(val) 
    puts_or_super(val, "foo") 
end 

def parent2(val) 
    puts_or_super(val, "bar") 
end 

Modifica: questo funziona, ma sembra folle

def puts_or_super(val, text) 
    if val 
    puts text 
    else 
    self.class.superclass.instance_method(caller[0][/`.*'/][1..-2].to_sym).bind(self).call 
    end 
end 

Eventuali soluzioni migliori?

+0

'super' è utilizzato per l'ereditarietà della classe. Tu usi due metodi diversi. Puoi estendere il tuo esempio per mostrare, in quali classi vuoi utilizzare il tuo esempio? E cosa vuoi chiamare? – knut

+0

Beh, volevo semplicemente renderlo semplice. Sia 'parent1' e' parent2' sono in una classe che è ereditata da un'altra. – freemanoid

risposta

0

Supponiamo che le definizioni siano nella classe A e che i metodi corrispondenti rilevanti siano definiti nella classe B in modo che A erediti da B.

Penso che dovresti andare il contrario. Creare un modulo B e anteporre B a A. Quindi, le definizioni in cui si dispone dello "foo", "bar", ecc. Non sarebbero i metodi super e le condizioni saranno nel modulo anteposto.

module B 
    def parent1(val) 
    return super if val 
    ... # your original logic in super class 
    end 
    def parent2(val) 
    return super if val 
    ... # your original logic in super class 
    end 
end 

class A 
    prepend B 
    def parent1(_); puts "foo" end 
    def parent2(_); puts "bar" end 
end 
+0

Forse ho fornito un cattivo esempio, quindi ho deciso di non rispondere alla mia domanda ma semplifica l'esempio. Scusa, ma non è quello di cui ho bisogno. Fondamentalmente, voglio utilizzare i metodi 'parent1' e' parent2', specialmente la parte chiamata 'super'. – freemanoid

Problemi correlati