Вы получите ожидаемое поведение.Ключ в семантике super
.Давайте рассмотрим несколько примеров перед анализом вашего дела:
Пример 1
ClassA "implements msg"
ClassB "implements msg"
ClassC "implements msg"
Это означает, что унаследованная версия msg
переопределяется в ClassB
и ClassC
.В этом случае
super msg "sent from ClassC invokes ClassB >> msg"
super msg "sent from ClassB invokes ClassA >> msg"
super msg "sent from ClassA will signal MessageNotUnderstood"
(я предполагаю, что msg
не реализован выше ClassA
)
Пример 2
ClassA "implements msg"
ClassB "does not implement msg"
ClassC "implements msg"
Тогда
super msg "sent from ClassC invokes ClassA >> msg"
super msg "sent from ClassB invokes ClassA >> msg"
Пример 3
ClassA "implements msg"
ClassB "does not implement msg"
ClassC "does not implement msg"
Здесь
super msg "sent from ClassC invokes ClassA >> msg"
super msg "sent from ClassB invokes ClassA >> msg"
Итак, семантика super
равна: начать поиск в моем суперклассе .
Ваш случай
У вас есть
Object "implements class"
Sup "does not implement class"
Sub "does not implement class"
Поэтому при отправке super class
с Sub
это вызовет Object >> class
, верно?Что аналогично отправке self class
(потому что class
не реализовано в Sub
), то есть Sub
.И поскольку Sub new print_superclass
отправляет super class
из Sub
, вы получаете Sub
.