Является ли C # одной отправкой или несколькими языками отправки? - PullRequest
30 голосов
/ 26 января 2009

Я пытаюсь понять, что такое одиночная и множественная отправка.

Я только что прочитал это:
http://en.wikipedia.org/wiki/Multiple_dispatch

И из этого определения мне кажется, что C # и VB.Net являются множественными диспетчеризациями, хотя выбор перегрузки для вызова производится во время компиляции.

Я здесь прав, или я что-то упустил? Спасибо!

Ответы [ 8 ]

40 голосов
/ 27 января 2009

ОК, я понял тонкую разницу, когда перегрузка функции отличается от многократной отправки.

В основном, разница в том, какой метод вызывать, выбран во время выполнения или во время компиляции. Теперь я знаю, что все это говорили, но без четкого примера это звучит ОЧЕНЬ очевидно, учитывая, что C # статически типизирован, а языки с множественной диспетчеризацией (по-моему, по крайней мере мне) кажутся динамически типизированными. До сих пор только с этим определением множественная диспетчеризация и перегрузка функций звучали для меня совершенно одинаково.

Случай, когда это имеет реальное значение, - это когда у вас есть 2 перегрузки метода, которые различаются по типу параметра, но эти 2 типа являются полиморфными, и вы вызываете ссылку, объявленную как более высокий тип, который имеет объект более низкого типа ... (Если кто-то может придумать лучший способ выразить это, пожалуйста, не стесняйтесь редактировать этот ответ)

Пример:

int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}

void Main() { 
  IRebelAllianceShip theShip = new XWing();
  CaptureSpaceShip(theShip);
}

XWing, очевидно, реализует IRebelAllianceShip. В этом случае будет вызван первый метод, тогда как, если в C # реализована множественная диспетчеризация, будет вызван второй метод.

Извините за перефразировку документа ... Мне кажется, это самый простой способ объяснить это различие, чем просто чтение определений для каждого метода отправки.

Для более формального объяснения: http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading

18 голосов
/ 14 июня 2011

Для тех, кто находит эту статью с помощью поисковой системы, C # 4.0 вводит ключевое слово dynamic . Код будет выглядеть следующим образом.

int CaptureSpaceShip(IRebelAllianceShip ship) {}
int CaptureSpaceShip(XWing ship) {}

void Main() {   
    IRebelAllianceShip theShip = new XWing();  
    CaptureSpaceShip((dynamic)theShip);
}
5 голосов
/ 26 января 2009

C # - одна рассылка, но есть некоторые посты в блоге, которые по своему названию выглядят так, будто пытаются эмулировать мультиметоды. Если мне удастся загрузить одну из статей, я обновлю свой ответ здесь.

2 голосов
/ 26 января 2009

C # не поддерживает множественную отправку. Шаблон Visitor Design эмулирует то, что можно описать как множественную диспетчеризацию, даже несмотря на то, что шаблон Visitor в основном фокусируется на отделении алгоритма от иерархии.

1 голос
/ 26 января 2009

Согласно цитируемой статье Википедии , множественная отправка, по определению, основана на типах времени выполнения вовлеченных объектов, поэтому C # и VB.net не используют потому что решение принимается, как вы заявляете, во время компиляции.

0 голосов
/ 18 января 2015

Может быть, кто-то заинтересуется хорошим C # примером для множественной отправки с использованием динамического ключевого слова ( MSDN blog )

Википедия говорит, что C # 4.0 (динамический) является языком "множественной отправки". Я также считаю, что такие языки, как Java, C # (до 4.0), C ++, являются однократными.

0 голосов
/ 22 января 2014

Я понимаю, что это старый вопрос ..

В .Net 4.0 вы можете использовать ключевое слово dynamic для нескольких методов ... Для примера рассмотрим следующее .Net 4.0 Оптимизированный код для рефакторинга существующих условий "если" и оператора "is"

0 голосов
/ 26 января 2009

Шаблон посетителя GoF - пример того, как сделать двойную отправку. Скотт Мейерс «Более эффективный C ++» показывает, как это сделать в C ++. Вот ссылка от доктора Доббса, в которой рассказывается, как сделать двойную диспетчеризацию как на Java, так и на C ++.

...