Является ли С# одной отправкой или несколькими языками отправки?
Я пытаюсь понять, что такое одиночная и множественная отправка.
Я только что прочитал:
http://en.wikipedia.org/wiki/Multiple_dispatch
И из этого определения мне кажется, что С# и VB.Net являются множественными диспетчерами, хотя выбор перегрузки для вызова выполняется во время компиляции.
Я исправлю здесь, или я что-то упустил?
Спасибо!
Ответы
Ответ 1
ОК, я понял тонкую разницу, когда перегрузка функции отличается от многократной отправки.
В основном разница заключается в том, выбран ли какой метод для вызова во время выполнения или во время компиляции. Теперь я знаю, что все это говорили, но без ясного примера это звучит ОЧЕНЬ очевидным, учитывая, что С# является статически типизированным, а языки с несколькими адресами (по-видимому, для меня, по крайней мере) кажутся динамически типизированными. До сих пор только с этим определением для меня звучало то же самое, что и множественная отправка и перегрузка функций.
Случай, когда это имеет реальное значение, - это когда у вас есть 2 перегрузки метода, которые различаются по типу параметра, но 2 типа являются полиморфными, и вы вызываете ссылку, объявленную как более высокий тип, которая имеет объект более низкого типа...
(Если кто-то может подумать о лучшем способе выразить это, не стесняйтесь редактировать этот ответ)
Пример:
int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}
void Main() {
IRebelAllianceShip theShip = new XWing();
CaptureSpaceShip(theShip);
}
XWing, очевидно, реализует IRebelAllianceShip.
В этом случае будет вызываться первый метод, тогда как если бы С# реализовал множественную отправку, будет вызван второй метод.
Извините за перепрограмму doc... Это мне кажется самым ясным способом объяснить эту разницу, а не просто читать определения для каждого метода отправки.
Для более формального объяснения:
http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading
Ответ 2
Для тех, кто находит эту статью с помощью поисковой системы, С# 4.0 представляет ключевое слово dynamic. Код будет выглядеть следующим образом.
int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}
void Main() {
IRebelAllianceShip theShip = new XWing();
CaptureSpaceShip((dynamic)theShip);
}
Ответ 3
С# - единственная отправка, но есть некоторые сообщения в блогах, которые по своему названию выглядят так, будто они пытаются эмулировать мультиметоды. Если я могу загрузить одну из статей, я обновлю свой ответ здесь.
Ответ 4
С# не поддерживает множественную отправку. Шаблон дизайна посетителя эмулирует то, что можно охарактеризовать как множественную отправку, хотя шаблон Visitor в основном фокусируется на отдельном алгоритме из иерархии.
Ответ 5
В соответствии с цитируется статья Википедии, множественная отправка по определению основана на времени выполнения типы задействованных объектов, поэтому С# и VB.net не используют его, потому что решение принято, как вы заявляете, во время компиляции.
Ответ 6
Шаблон посетителя GoF - пример того, как делать двойную отправку. Скотт Майерс "Более эффективный С++" показывает вам, как это сделать на С++. Здесь ссылка от Добба, который рассказывает о том, как делать двойную отправку как на Java, так и на С++.
Ответ 7
Я понимаю, что это старый вопрос.
В .Net 4.0 вы можете использовать ключевое слово dynamic
для нескольких методов... Взгляните на приведенный ниже пример .Net 4.0 Оптимизированный код для рефакторинга существующих "if" ; условия и "вл етс" Оператор
Ответ 8
Возможно, кому-то будет интересен хороший пример С# для множественной отправки с использованием динамического ключевого слова (блог MSDN)
Википедия говорит, что С# 4.0 (динамический) - это язык с несколькими отправками. Я также считаю, что такие языки, как Java, С# (до 4.0), С++, являются отдельной отправкой.