2015-02-10 4 views
0

Я играю с путями применения отношений класса в Ruby, прежде чем начинать писать код в выходные дни. Я пытаюсь создать составную взаимосвязь, но я имею некоторый контроль над классом PriceSeries вне класса Commodity.Создание экземпляра композитного класса из метода экземпляра Ruby

Очевидно, что это не так, но есть ли причина для такой настройки? Правильно ли я думаю, что это сделало бы для частных данных и, возможно, было бы целесообразно хранить пароли для экземпляра пользователя (например)?

class ExcelFile 
    def initialize(name) 
     @name = name 
    end 
end 


class Commodity 
    def initialize(name) 
     @name = name 
    end 

    def new_price_series(name, source) 
     name = PriceSeries.new(name, source) 
    end 

    class PriceSeries 
     attr_accessor(:name) #Without this line, is there any point of this class?? 

     def initialize(name, source) 
      @source = source 
      @name = name 
     end 
    end 

end 



mm8_prices = ExcelFile.new("some_exlsx_file") 
gold = Commodity.new("gold") 
gold.new_price_series(:xau, mm8_prices) 

ответ

0

Можете ли вы объяснить, что вы подразумеваете под «принуждением классовых отношений в Ruby» и «составными отношениями»?

Определение класса внутри другого класса в Ruby, как вы это делали в примере, не дает никаких специальных привилегий класса по сравнению с другим, оно просто именует «внутренний» класс. то есть PriceSeries (при ссылке за пределами Commodity) будет Commodity::PriceSeries.

Это отличается от определения внутренних классов на таких языках, как C# и Java.

+0

что это разница? (я использовал только ruby ​​/ python/php и javascript). Я хочу дать понять, когда кодирование того, что экземпляр PriceSeries принадлежит товару и не может существовать без него, но товар может существовать без priceSeries. Кроме того, t [здесь может быть много PriceSeries за товар. Я думаю, что на самом деле я нашел способ сделать это, используя метапрограммирование, чтобы создать методы экземпляра в классе Commodity, которые являются объектами PricePoint. Это хороший способ сделать это? –

+0

В вашем примере вы просто определили класс Commodity :: PriceSeries. Нет особых отношений между Commodity и PriceSeries или их экземплярами - PriceSeries может быть создан кодом за пределами Commodity с использованием Commodity :: PriceSeries.new (имя, источник). Чтобы обеспечить соблюдение отношений, передайте экземпляр Commodity в конструктор PriceSeries. Экземпляр Commodity также может поддерживать коллекцию экземпляров PriceSeries. Это стандартный OO и не требует метапрограммирования. – silvabox