2015-06-26 9 views
5

Ich habe mehrere Methoden, die ähnliche bedingte Logik haben und ich denke, es ist sinnvoll, sie zu trocknen.Anruf super im Zusammenhang mit dieser Methode Anrufer

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 

Ist es möglich, eine #puts_or_super zu schaffen, die super ihrer Anrufer zu nennen wäre in der Lage? (B#parent1 oder B#parent2) So wird der Code wie folgt aussehen:

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

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

bearbeiten: Das funktioniert aber sieht verrückt

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 

Noch bessere Lösungen?

+0

'Super' wird für Klassenvererbung verwendet. Sie verwenden zwei verschiedene Methoden. Können Sie Ihr Beispiel erweitern, um zu zeigen, in welchen Klassen Sie Ihr Beispiel verwenden möchten? Und was willst du anrufen? – knut

+0

Nun, ich wollte es einfach halten. Sowohl "parent1" als auch "parent2" gehören zu einer Klasse, die von einer anderen geerbt wird. – freemanoid

Antwort

0

Angenommen, Ihre Definitionen sind in der Klasse A und die relevanten Supermethoden sind in der Klasse B definiert, so dass A von B erbt.

Ich denke, Sie sollten den umgekehrten Weg gehen. Stellen Sie B ein Modul und B zu A vor. Dann wären die Definitionen, in denen Sie die "foo", "bar" usw. haben, nicht die Super-Methoden, und die Bedingungen werden im vorausgegangenen Modul sein.

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

Vielleicht habe ich ein schlechtes Beispiel angegeben, also habe ich beschlossen, meine Frage nicht zu beantworten, sondern das Beispiel zu vereinfachen. Entschuldigung, aber das brauche ich nicht. Im Grunde möchte ich DRY 'parent1' und' parent2' Methoden, vor allem 'super' Aufrufteil. – freemanoid

Verwandte Themen