Разница между мультиметодами и перегрузкой
Вопрос
Контекст
Я программировал в Java уже несколько лет. И банкомат, я изучаю что -то совершенно другое: clojure. Там проблема выражения может быть решена с помощью мультиметодов, тогда как в Java вам понадобится что -то вроде шаблона посетителей или что -то похожее.
Вопрос
Я читал о мультиметодах и очень запутался с фактической разницей с перегрузкой метода.
Единственная разница, которую я обнаружил до сих пор, что мультиметод не зависит от типа времени выполнения объекта, на котором называется метод.
Решение
Перегрузка - это когда два или более метода имеют одинаковое имя, но разные подписи (разные типы аргументов, разное количество аргументов). Перегрузка разрешается статически, в зависимости только от статических типов аргументов. (Например, взаимодействие перегрузки и перегрузки в Java делает историю немного более сложной). Перегрузка решает статически к конкретной подписи метода. Затем во время выполнения Dynamic Dispatch выберет наиболее подходящий метод с этой подписью.
Мультиметоды - это набор методов, которые имеют одинаковое имя, одинаковое количество аргументов и перекрытие Тип подписи. Всякий раз, когда звонок проводится с мультиметодом (с использованием названия мультиметода), все методы в коллекции рассматриваются как возможный кандидат для отправки. Точный кандидат выбирается в зависимости от типов времени выполнения аргументов - наиболее конкретный метод выбран. Фактические типы времени выполнения всех аргументов используются для определения того, какой из них запускается, что отличается от традиционной единой диспетчеры в Java, где используется только первый аргумент (цель) метода, чтобы определить, какой тело метода выполняется.
Другие советы
Насколько я понимаю:
Мультиметоды являются обобщением полиморфизма метода.
Мультиметод состоит из 2 частей
Имя
А
dispatch method
: который будет производитьdispatch value
На основании этого значения отправки будет выбран соответствующий метод. Перегрузка - это особый случай мультиметодов, где метод отправки вернет статический тип в качестве значения отправки
В общем, метод отправки может быть чем угодно. Он может вернуть другие значения, кроме типа.