Что такое метод отправки? - PullRequest
29 голосов
/ 26 ноября 2009

Что такое метод отправки? Я могу найти несколько конкретных примеров, но абстрактное определение метода диспетчеризации ускользает от меня. Кто-нибудь хочет рисковать их?

Ответы [ 2 ]

27 голосов
/ 28 ноября 2009

Сначала скажем, что такое сообщение и метод:

  • A message - это имя, которое можно отправлять от одного объекта к другому, возможно, с дополнительными объектами в качестве аргументов. Например, в

    account withdraw: 100
    

    Сообщение: withdraw: (синтаксис Smalltalk.) (Другие языки могут писать account.withdraw(100).) Объект, получающий сообщение, в данном примере account, называется приемник .

  • A метод - это реализация, которая может быть вызвана в ответ на сообщение.

Эти идеи распространяются среди широкого спектра объектно-ориентированных языков, иногда под разными именами. Например, C ++ называет сообщение «функцией виртуального члена».

Сейчас:

  • Метод отправки - это алгоритм, используемый для определения , какой метод должен вызываться в ответ на сообщение. Алгоритмы сильно различаются по языкам:

    • Такие языки, как Smalltalk, которые имеют классы и единичное наследование, обращаются к классу получателя. Если метод определен в этом классе, этот метод вызывается. В противном случае алгоритм проверяет уникальный суперкласс и т. Д.

    • В C ++ метод по-прежнему определяется классом получателя, но поскольку у класса может быть несколько суперклассов, проблема с выбором метода для вызова более сложна.

    • В таких языках, как Self, у которых есть методы, но нет классов, метод либо находится в именованном slot на самом приемнике, либо, возможно, находится в прототипе, из которого был получен объект. клонировали.

    • В более продвинутых объектно-ориентированных языках алгоритм диспетчеризации методов проверяет не только получатель, но и аргументы , которые передаются вместе с сообщением. Эту идею иногда называют «мультиметодами». (До некоторой степени эту технику можно смоделировать, используя то, что Smalltalk называет двойная диспетчеризация , но это требует затрат на программирование и затрат на производительность.) Я считаю, что языки Cecil, Diesel и Dylan используют некоторую форму мультиметода отправка, но я балансирую на грани своего опыта.

12 голосов
/ 26 ноября 2009

Трудно сказать без контекста, но я бы описал его как процесс, который принимает вызов метода в исходном коде, решает, какой метод должен быть выполнен, и выполняет его, выполняя любые преобразования аргументов, значения по умолчанию и т. Д., Как того требует язык.

Решающая часть диспетчеризации метода может быть чисто во время выполнения (например, на динамическом языке), чисто во время компиляции (например, вызывая статический метод в C # / Java), или в обеих (вызывая виртуальный метод в C # / Java). ).

Разные языки могут иметь существенно разные подходы к отправке метода.

...