Подтвердить что ты не робот

Что такое отправка метода?

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

4b9b3361

Ответ 1

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

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

    account withdraw: 100
    

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

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

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

Сейчас:

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

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

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

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

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

Ответ 2

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

Часть решения при отправке метода может быть чисто во время выполнения (например, на динамическом языке), чисто во время компиляции (например, вызов статического метода в С#/Java) или оба (вызов виртуального метода в С#/Java).

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