сообщение "class" отправлено суперклассу в Smalltalk - PullRequest
3 голосов
/ 21 июня 2019

Рассмотрим следующие классы:

Object subclass: Sup [].

Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ].

Когда я пытаюсь запустить метод print_superclass на Sub, я получаю

> Sub new print_superclass.
Sub

Я ожидал, что здесь получу Sup, потому что вызов class был перенесен обратно в суперкласс Sub, который равен Sup. Почему он так себя ведет?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Потому что super - это псевдопеременная, указывающая на получателя сообщения. Супер и я указывают на один и тот же объект и имеют одинаковую идентичность.

super == self ---> true

Разница между ними заключается в том, что super указывает поиску сообщений начать поиск следующего в словаре метода "выше", содержащего метод.

Определение сбивает с толку, но в этом случае super говорит только, что поиск метода #class начинается не с Sub методов, а с Sup . Однако это не имеет эффекта, поскольку #class определен на более высоком уровне иерархии, и его реализация относится к классу получателя, который является экземпляром Sub

1 голос
/ 21 июня 2019

Вы получите ожидаемое поведение.Ключ в семантике 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...