Ruby Design Pattern Question - Наследование классов / модулей - PullRequest
1 голос
/ 30 декабря 2010

Прямо сейчас у меня есть:

module A  
  class B
    def initialize
       @y = 'foo'
    end  
  end
end

module A   
  class C < B
    def initialize
       @z = 'buzz'
    end   
  end
end

Как я могу получить его, чтобы при создании экземпляра C @y все равно было установлено значение 'foo'?Должен ли я повторить это в инициализации под C?Я следую плохому образцу?Должна ли @y быть переменной класса или просто константой в модуле?Любая помощь будет оценена!

Ответы [ 2 ]

3 голосов
/ 30 декабря 2010
class A::C < B
   def initialize( x, y )
     super # With no parens or arguments, this passes along whatever arguments
           # were passed to this initialize; your initialize signature must
           # therefore match that of the parent class
     @z = 'buzz'
   end
end

Или, как указал @EnabrenTane, вы можете явно передавать любые аргументы, которые, как вы знаете, будет ожидать суперкласс.

Подробнее о наследовании см. В разделе Наследование иСообщения в старой, но бесплатной онлайн-версии книги Кирки.

2 голосов
/ 30 декабря 2010

Вам нужно ключевое слово super.Он вызывает у ваших родителей определение того же метода.

Я добавил параметры на всякий случай. Примечание , для передачи параметров B # инициализация также должна принимать необязательные параметры.

module A   
  class C < B
    def initialize(params = nil)
       super(params) # calls B#initialize passing params
       @z = 'buzz'
    end   
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...