Что такое отправка метода? Я могу найти несколько конкретных примеров, но абстрактное определение метода отправки ускользает от меня. Кто-нибудь захочет рисковать своими услугами?
Что такое отправка метода?
Ответ 1
Сначала скажем, что такое сообщение и способ:
-
Сообщение - это имя, которое может быть отправлено с одного объекта на другой, возможно с дополнительными объектами в качестве аргументов. Например, в
account withdraw: 100
Сообщение
withdraw:
(синтаксис Smalltalk.) (Другие языки могут писатьaccount.withdraw(100)
.) Объект, получающий сообщение в этом примереaccount
, называется получателем. -
Метод - это реализация, которая может быть вызвана в ответ на сообщение.
Эти идеи разделяются между множеством объектно-ориентированных языков, иногда под разными именами. Например, С++ вызывает сообщение "виртуальная функция-член".
Сейчас:
-
Отправка метода - это алгоритм, используемый для определения того, какой метод следует вызывать в ответ на сообщение. Алгоритмы сильно различаются по языкам:
-
Языки, такие как Smalltalk, которые имеют классы и одно наследование, относятся к классу получателя. Если метод определен в этом классе, этот метод вызывается. В противном случае алгоритм проверяет уникальный суперкласс и т.д.
-
В С++ метод по-прежнему определяется классом получателя, но поскольку класс может иметь несколько суперклассов, проблема принятия решения о вызове метода более сложна.
-
В таких языках, как "Я", у которых есть методы, но нет классов, этот метод либо найден в именованном слоте на самом приемнике, либо, возможно, найден в прототипе, из которого клонирован объект.
-
В более продвинутых объектно-ориентированных языках алгоритм-метод отправки исследует не только получателя, но и аргументы, передаваемые вместе с сообщением. Эта идея иногда упоминается как "мультиметоды". (В какой-то степени этот метод можно моделировать, используя то, что Smalltalk вызывает двойную отправку, но там стоимость программирования и стоимость исполнения.) Я считаю, что языки Cecil, Diesel и Dylan используют некоторую форму отправки нескольких меток, но я балансируя на грани моего опыта.
-
Ответ 2
Трудно сказать без контекста, но я бы описал его как процесс, который принимает вызов метода в исходном коде, решает, какой метод требует выполнения, и выполняет его, выполняя любые преобразования аргументов, по умолчанию и т.д., как требуется язык.
Часть решения при отправке метода может быть чисто во время выполнения (например, на динамическом языке), чисто во время компиляции (например, вызов статического метода в С#/Java) или оба (вызов виртуального метода в С#/Java).
Различные языки могут иметь существенно разные подходы к отправке методов.