2016-06-22 5 views
0

Hier ist die aktuelle Situation neu definiert wird:Aufruf eine Klasse-Funktion, die von einer inkludierten Modul in Ruby

Core_Class die Schlüssel-Klasse ist, die eine Menge von Modulen Use_Class von Core_Class

In einem erbt umfasst von Die Module von Core_Class sollen auf eine in der Core_Class definierte Methode zugreifen. Das funktioniert gut. Lassen Sie uns diese Methode header() aufrufen

Ich versuche jetzt, diese Funktion in Use_class neu zu definieren, so dass die use_class eine eindeutige Header-Methode hat.

Das alles sieht ein bisschen wie folgt aus:

module Print_header 
    def print_header_ 
    Core_Class.header() 
    end 
end 
class Core_Class 
    include Print_header 
    def header() 
    puts "old header" 
    end 
    def run 
    print_header 
    end 
end 
class Use_Class < Core_Class 
    def header() 
    puts "New header" 
    end 
    def run 
    print_header 
    end 
end 

Nun mein Problem ist, dass der alte Code verwendet wird. Ich habe das Gefühl, dass mir etwas an objektorientierter Programmierung, Vererbung und Mixins fehlt, aber ich bin unsicher was. Ich verbrachte ungefähr 2 Stunden damit, es zu googeln, konnte nichts finden, was mir beim Verständnis half, und ich bin der einzige Ruby (sehr sehr Junior) Entwickler im Büro.

Wenn möglich, können Sie eine Erklärung hinzufügen, was falsch ist, außer einer Lösung?

Dank

+2

Beitrag _working_ Code, bitte. Sie können kein Modul mit einem Kleinbuchstaben definieren. Außerdem enthalten die Klassen in Ihrem Code das Modul nicht und Sie rufen 'print_header' nicht auf. Außerdem sieht 'Core_Class' seltsam aus, stattdessen sollten Sie' CoreClass' verwenden. – Stefan

+0

In Ihrem Beispiel wird 'CoreClass' im' PrintHeader' Modul verwendet. Im Grunde ist es nur eine falsche Idee aus der Sicht der Architektur. Ihr 'PrintHeader' muss" nichts wissen "über irgendeine andere Klasse (' CoreClass' oder 'UseClass'). Und etwas Seltsames: 'print_header' druckt keinen Header, aber' header' implementiert nur diese Funktionalität. –

+0

Sorry für den Mangel an Arbeitscode, ich remoting in eine Unix-Umgebung ohne die Möglichkeit, Code zu nehmen –

Antwort

0

Ich denke, dass Sie so etwas implementieren möchten:

module PrintHeader 
    def print_header 
    puts header 
    end 
end 

class CoreClass 
    include PrintHeader 

    def header 
    'old header' 
    end 
end 

class UseClass < CoreClass 
    def header 
    'New header' 
    end 
end 

core = CoreClass.new 
use = UseClass.new 

core.header 
# => 'old header' 
core.print_header 
# old header 
# => nil 
use.header 
# => 'New header' 
use.print_header 
# New header 
# => nil