Вопрос

Контекст

Я программировал в Java уже несколько лет. И банкомат, я изучаю что -то совершенно другое: clojure. Там проблема выражения может быть решена с помощью мультиметодов, тогда как в Java вам понадобится что -то вроде шаблона посетителей или что -то похожее.

Вопрос

Я читал о мультиметодах и очень запутался с фактической разницей с перегрузкой метода.

Единственная разница, которую я обнаружил до сих пор, что мультиметод не зависит от типа времени выполнения объекта, на котором называется метод.

Это было полезно?

Решение

Перегрузка - это когда два или более метода имеют одинаковое имя, но разные подписи (разные типы аргументов, разное количество аргументов). Перегрузка разрешается статически, в зависимости только от статических типов аргументов. (Например, взаимодействие перегрузки и перегрузки в Java делает историю немного более сложной). Перегрузка решает статически к конкретной подписи метода. Затем во время выполнения Dynamic Dispatch выберет наиболее подходящий метод с этой подписью.

Мультиметоды - это набор методов, которые имеют одинаковое имя, одинаковое количество аргументов и перекрытие Тип подписи. Всякий раз, когда звонок проводится с мультиметодом (с использованием названия мультиметода), все методы в коллекции рассматриваются как возможный кандидат для отправки. Точный кандидат выбирается в зависимости от типов времени выполнения аргументов - наиболее конкретный метод выбран. Фактические типы времени выполнения всех аргументов используются для определения того, какой из них запускается, что отличается от традиционной единой диспетчеры в Java, где используется только первый аргумент (цель) метода, чтобы определить, какой тело метода выполняется.

Другие советы

Насколько я понимаю:

Мультиметоды являются обобщением полиморфизма метода.

Мультиметод состоит из 2 частей

  1. Имя

  2. А dispatch method: который будет производить dispatch value

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

В общем, метод отправки может быть чем угодно. Он может вернуть другие значения, кроме типа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top