Как "супер" в уточнении может вызвать переопределенный метод?
У меня сложилось впечатление, что доработки выходят за рамки обычной схемы наследования в Ruby; что переопределение метода в уточнении заменило исходный метод для всего кода, использующего уточнение.
Но потом я попробовал этот эксперимент с super
и оказывается, что переопределенный метод вызывается:
class MyClass
def my_instance_method
puts "MyClass#my_instance_method"
end
end
module MyRefinement
refine(MyClass) do
def my_instance_method
puts "MyClass#my_instance_method in MyRefinement"
super
end
end
end
using MyRefinement
MyClass.new.my_instance_method
Вышеприведенный код выводит:
MyClass#my_instance_method in MyRefinement
MyClass#my_instance_method
У меня вопрос как? Вставлено ли уточнение в иерархию классов каким-либо образом?
1 ответ
Решение
Основываясь на документации, поиск метода для встроенного поведения уточнения такой же, как вы наблюдали.
Ваше предположение было верным, что это не типичное наследование, которое можно увидеть, вызвав superclass
class C
def foo
puts "C#foo"
end
end
module M
refine C do
def foo
puts "C#foo in M"
puts "class: #{self.class}"
puts "superclass: #{self.class.superclass}"
super
end
end
end
using M
x = C.new
x.foo
Выход:
C#foo in M
class: C
superclass: Object
C#foo