Проблема здесь в том, что B
определяет новый bar
метод, который вытесняет метод, определенный в A
.Если вам нужно сохранить унаследованное поведение, вы должны создать псевдоним для этой цели:
class A
def foo
original_bar
end
def bar
puts "A"
end
alias_method :original_bar, :bar
end
class B < A
def foo
super
end
def bar
puts "B"
end
end
Использование здесь alias_method
сохраняет «копию» исходного метода, который подкласс не делает.не отменяйте.
Вы правы, хотя, это немного грязно.Вы можете объявить bar
как private
, чтобы его нельзя было так просто отменить.