2012-07-31 4 views
0

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

class BaseClass 
    def behavior 
    puts 'base class behavior' 
    end 
end 

module ChildModule 
    def behavior 
    super.behavior 
    puts 'child module behavior' 
    end 
end 

o = BaseClass.new 
o.extend ChildModule 
o.behavior 

и выводит следующий образом (с рубином 1.9 .2p290 (2011-07-09 редакция 32553) [x86_64-линукс])

base class behavior 
t.rb:9:in `behavior': undefined method `behavior' for nil:NilClass (NoMethodError) 
     from t.rb:16:in `<main>' 

Я думаю, что я не могу использовать super, поскольку super не существует в модуле. Но он печатает эту строку из метода super, это странно?

Как достичь этого, что я хочу выше?

Ответа на этот вопрос @davidrac, быв быть более любопытным, хотел бы знать, как я могу получить дескриптор экземпляра базового класса? Скажем, например, я добавил следующий метод в BaseClass

def behavior2 
    puts 'base class behavior2' 
end 

и переопределяет его в ChildModule. Теперь из поведения ChildModule я могу позвонить на поведение2 BaseModule?

+0

Возможный дубликат .. http://stackoverflow.com/questions/1547074/calling-base-class-method-from-overloaded-method-in-sub -класс –

ответ

1

Я думаю, что правильный синтаксис:

module ChildModule 
    def behavior 
    super 
    puts 'child module behavior' 
    end 
end 
+0

спасибо, он работает, как глупо am :), должен был попробовать его –

+0

просто быть любопытным, изменяя мой вопрос, чтобы узнать, как я получаю дескриптор базового класса –

+0

просто используйте MyClass.superclass. см. здесь: http://www.ruby-doc.org/core-1.9.3/Class.html – davidrac

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