2017-02-17 36 views
0

Итак, я сделал одну программу с одним классом, содержащим несколько классов, но я подумал, что было бы более организованным разделить его на несколько программ, по одному для каждого подкласса. Будет ли это лучшим способом организовать мой код, и это повлияет на производительность или что-то еще?Вложенные классы в разные файлы с наследованием

И как я могу разделить этот код на два файла? Основная программа будет иметь класс Texty, и мне нужно каким-то образом включить класс String из другого файла, но вы не можете включать классы в Ruby, так как это можно сделать, сохраняя при этом наследование от Texty? И как мне получить доступ к переменной экземпляра @inst_var из другого файла?

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

Вложенные классы, подобные этому, не создают каких-либо отношений между Texty и String. Вы можете вывести класс String (я бы выбрал другое имя для этого) в свой собственный файл, потребовать Texty прямо перед его объявлением и поддерживать тот же результат, который вы получаете сейчас. –

+0

Ну ... Не совсем то же самое, потому что вы будете ссылаться на String за пределами пространства имен Texty, но я думаю, что вы получили картину. –

+0

Могу ли я получить доступ к переменным экземпляра в Texty таким образом? (Из строки) –

ответ

0

Разделение кода на несколько файлов и объектов будет облагать налогом, но настолько мало, что вы даже не заметите.

Если вы раскалываете программу по классам, мое предложение состоит в том, чтобы использовать соглашения об именах рельсов.

TestClass ->test_class.rb

Затем в верхней части основной программы сделать: require_relative 'test_class.rb'

0

Попробуйте разделения ваших файлов, как это, и посмотреть, что происходит.

В texty/texty.rb:

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

В texty/string.rb:

require_relative 'texty.rb' 

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

Затем запустите из командной строки:

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

Он должен печатать 1, указывая, что ваш Texty::String класс унаследовал инициализация t он @x ivar от его родительского класса Texty.

 Смежные вопросы

  • Нет связанных вопросов^_^