Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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, так и на С++.

Ответ 8

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

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