2017-02-17 3 views
0

Also machte ich ein einzelnes Programm mit einer Klasse, die eine Anzahl von Klassen enthielt, aber ich dachte, es wäre besser organisiert, es in mehrere Programme aufzuteilen, eins für jede Unterklasse. Wäre dies eine bessere Möglichkeit, meinen Code zu organisieren, und wirkt sich dies auf die Leistung aus?Verschachtelte Klassen in verschiedenen Dateien mit Vererbung

Und wie würde ich diesen Code in zwei Dateien teilen? Das Hauptprogramm würde die Texty-Klasse haben, und ich müsste irgendwie die String-Klasse aus einer anderen Datei einschließen, aber Sie können keine Klassen in Ruby einschließen, also wie würde dies geschehen, während auch die Vererbung von Texty beibehalten wird? Und wie würde ich auf die Instanzvariable @inst_var von der anderen Datei zugreifen?

class Texty 
    def initialize 
    @inst_var = 0 
    end 
    def texty_method 
    puts 'Bar' 
    end 
    class String < Texty 
    def output(string) 
     puts string 
    end 
    end 
end 

Texty::String.new.output('Foo') 
+0

Nesting-Klassen wie diese erzeugen keine Beziehung zwischen Texty und String. Sie können die String-Klasse (ich würde einen anderen Namen dafür wählen) in eine eigene Datei ziehen, Texty direkt vor der Deklaration anfordern und das gleiche Ergebnis beibehalten, das Sie jetzt erhalten. –

+0

Nun ... Nicht ganz das Gleiche, weil Sie auf String außerhalb des Texty-Namensraums verweisen würden, aber ich denke, Sie haben das Bild bekommen. –

+0

Kann ich auf diese Weise weiterhin auf die Instanzvariablen in Texty zugreifen? (Von String) –

Antwort

0

Splitting Ihren Code in mehrere Dateien und Objekt wird die Leistung besteuern aber so wenig, dass Sie nicht einmal bemerken.

Wenn Sie Programm nach Klassen aufteilen, ist mein Vorschlag, die Benennungskonventionen für Schienen zu verwenden.

TestClass ->test_class.rb

Dann an der Spitze des Hauptprogramms tun: require_relative 'test_class.rb'

0

Versuchen Sie, Ihre Dateien auf wie diese Spaltung, und sehen, was passiert.

In texty/texty.rb:

class Texty 
    def initialize(x) 
    @x = x 
    end 
end 

In texty/string.rb:

require_relative 'texty.rb' 

class Texty 
    class String < Texty 
    def test 
     puts @x 
    end 
    end 
end 

Dann von der Kommandozeile:

$ ruby -r ./texty/string.rb -e "Texty::String.new(1).test" 

Es 1 gedruckt werden soll, was darauf hinweist, dass Ihre Texty::String Klasse geerbt die Initialisierung von t er @x ivar von seiner Elternklasse von Texty.

Verwandte Themen