Действительно ли C# является единственной отправкой, или несколько диспетчеризируют язык?

Если вы хотите вызвать функцию, просто вызовите ее так же, как и любую другую:

montarMenu(this);
30
задан Maniero 18 August 2013 в 14:10
поделиться

5 ответов

Хорошо, я понял тонкое различие, где перегрузка функции отличается от нескольких-отправок.

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

40
ответ дан Daniel Magliola 27 November 2019 в 23:34
поделиться

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

5
ответ дан JoshBerke 27 November 2019 в 23:34
поделиться

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

2
ответ дан Schildmeijer 27 November 2019 в 23:34
поделиться

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

1
ответ дан Hank Gay 27 November 2019 в 23:34
поделиться

Шаблон "посетитель" GoF является примером того, как сделать двойную отправку. Scott Meyers "Более эффективный C++" показывает Вам, как сделать это в C++. Вот ссылка от доктора Dobbs, который говорит о том, как сделать двойную отправку и в Java и в C++.

0
ответ дан duffymo 27 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: