2013-11-14 1 views
0

Корневой класс Отгрузка хочет записать всех своих детей. Но когда класс Grandchild наследуется от ребенка Shipping, возникает ошибка. Кто-нибудь знает, почему это происходит? Заранее спасибо.Метод рубинового крючка унаследовал родственный - Почему @children изменился на нуль?

Код:

class Shipping 
    @children = [] 
    def self.inherited(child) 
    puts "#{child.name} inherit Shipping" 
    @children << child 
    end 
    def self.show_children 
    p @children 
    end 
end 

class Child1 < Shipping 
end 

class Child2 < Shipping 
end 

class Grandchild < Child2 
end 

Shipping.show_children 

Результат:

$ jruby temptry.rb 
    Child1 inherit Shipping 
    Child2 inherit Shipping 
    Grandchild inherit Shipping 
    NoMethodError: undefined method `<<' for nil:NilClass 
     inherited at temptry.rb:5 
      (root) at temptry.rb:18 

ответ

0

Когда класс наследует другой, методы унаследованы, но переменная экземпляра класса не особенно инициализирован. Вы только инициализировали @children за Shipping, но не сделали этого для Grandchild.

Если вы хотите разделить переменную между унаследованными классами, то вы должны использовать переменную класса. Если вы делаете:

class Shipping 
    @@children = [] 
    ... 
end 

и изменить все @children к @@children, то они будут разделены.

+1

Я изменяю @ на @@, это действительно работает. Большое спасибо. :-) – uncutstone

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