Исходя из моего понимания алгоритма поиска метода ruby, я не верю, что можно достичь того, что вы пытаетесь сделать, без использования разных имен методов или без чрезмерного удаления метода bar в подклассе.
Проблема в том, что "self", которое получает сообщение foo при вызове методом bar в классе A, всегда будет экземпляром класса B (при вызове из экземпляра класса B).Поскольку собственный метод foo класса B всегда будет сначала найден алгоритмом поиска метода ruby, нет способа вызвать оригинальный метод foo класса A (ведь класс B переопределяет унаследованный метод foo класса A).
A notтаким элегантным решением было бы использование «вокруг псевдонимов», как показано ниже, но оно также требует переопределения метода bar:
class B < A
alias :old_foo :foo
def foo
p "world"
end
def bar
old_foo
end
end