Является ли C# одной отправкой или несколькими языками отправки?

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

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

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

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

8 ответов

Решение

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

В основном, разница в том, какой метод вызывать, выбран во время выполнения или во время компиляции. Теперь я знаю, что все это говорили, но без четкого примера это звучит ОЧЕНЬ очевидно, учитывая, что 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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам