2016-07-14 17 views
0

Ich hatte gehofft, eine Menge Logik in eine separate Klasse im folgenden Code zu extrahieren, aber ich habe Probleme damit, da es am Ende eine geschützte Methode aufruft.Wie kann ich Code in seine eigene Klasse extrahieren und dennoch eine geschützte Methode aufrufen?

Dies ist mein aktueller Code:

class ExcelSheet 
    ... 
    protected 

    def save_stuff 
    # do work 
    end 
end 

class CustomSheet < ExcelSheet 
    def custom_stuff 
    # lots of logic 
    save_stuff 
    # more logic 
    end 
end 

Das war mein versucht Code:

class LogicManager 
    def logic_valid? 
    # lots of logic 
    save_stuff 
    end 
end 

class CustomSheet < ExcelSheet 
    def custom_stuff 
    manager = LogicManager.new(some_data) 
    if manager.logic_valid? 
     # more logic 
    end 
    end 
end 

Leider gibt es in meinem LogicManager Ich kann save_stuff nicht nennen, weil es protected ist. Ich habe nicht die ursprüngliche Methode geschrieben, und ich bin sicher, dass es aus einem bestimmten Grund als protected markiert ist, also denke ich nicht, dass ich das ändern sollte.

Welche Optionen muss ich noch gut refaktorieren?

+0

Soll die 'LogicClass' ein Kind von' ExcelSheet' sein? Ich sehe nicht, wie Sie die Methode in dieser Klasse aufrufen, wenn sie nicht existiert, außer Sie haben sie woanders definiert? – user1875195

+0

Ich habe etwas mehr Detail hinzugefügt. Dies ist der erste Weg, an den ich denken könnte, um den Code ein wenig zu vereinfachen. – ardavis

+0

Ich sehe die Änderungen, aber ich sehe immer noch nicht, wie Sie 'save_stuff' von der' logic_valid? 'Methode in Ihrer' LogicManager' Klasse erwarten. Die Methode 'save_stuff' ist derzeit in' ExcelSheet' definiert, die keine Beziehung zur Klasse 'LogicManager' hat. – user1875195

Antwort

0

Es scheint, dass Sie ein bisschen ein Missverständnis von protected Methoden.

Geschützte Methoden können nur von der Klasse, die sie definiert, oder von ihren Unterklassen aufgerufen werden. In Ihrem Fall bedeutet dies, dass wenn Sie die Methode save_stuff in der Klasse LogicManager aufrufen möchten, dass LogicManager von ExcelSheet erben muss.

die Benennung der Klassen gegeben, bin ich nicht sicher, ob Sie wollen, dass es mir nicht logisch erscheinen (kein Wortspiel beabsichtigt).

+0

Das kam mir in den Sinn, stimme ich voll und ganz zu. Ich denke nicht, dass es von 'ExcelSheet' erben sollte, weil es kein Blatt ist. Ich habe gerade versucht, Code an anderer Stelle zu extrahieren. Vielleicht mache ich das alles falsch. Ich werde morgen mehr nachdenken. – ardavis

+0

Wenn es Sinn macht, extrahieren Sie 'save_stuff' in ein Modul und fügen Sie es (mixin) in die benötigten Klassen ein? Seien Sie sich dessen bewusst, dass dies für alle eine öffentliche Methode sein wird. –