Динамическая отправка и привязка - PullRequest
14 голосов
/ 10 февраля 2009

Динамическая отправка и динамическое связывание - это одно и то же?

Спасибо

Maciej

Ответы [ 2 ]

16 голосов
/ 10 февраля 2009

Нет.

Динамическая отправка - фактическая цепочка методов / сигнатур / переопределений привязывается во время компиляции. Вызываемый метод зависит от фактического типа времени выполнения объекта, но никакой реальной интерпретации не происходит. Это все еще будет версия статически связанного метода.

Вот пример на C #.

class Foo { 
  public override string ToString() { return "foo's ToString"; }
}

void Example(object p1) { 
  p1.ToString();
}

Вызов p1.ToString является примером динамической отправки. Код статически привязывается к методу ToString. Однако это виртуальный метод, поэтому фактический вызванный метод .ToString () не будет известен до времени выполнения, но при вызове метода .ToString () гарантируется . Это будет ToString фактического типа p1. Так что, если p1 на самом деле является экземпляром Foo, будет вызван Foo :: ToString.

Динамическое связывание - Фактический метод связан во время выполнения и подлежит интерпретации на основе семантики языка или структуры отражения. Это может не получиться из-за невозможности связать.

Пример:

void CallBar(object o) {
  var method = o.GetType().GetMethod("Bar");
  method.Invoke(new object[] {o});
}

В этом случае мы пытаемся вызвать метод «Бар» для рассматриваемого объекта. Ключевое слово пытается. Вполне возможно, что «Бар» не будет существовать на объекте. Но это определяется во время выполнения динамической привязкой к методу «Бар».

Самое общее у них то, что обе операции (вероятно) зависят от типа времени выполнения объекта.

EDIT

Добавлено еще несколько примеров по запросу ОП

3 голосов
/ 10 февраля 2009

Динамическая диспетчеризация или динамическое связывание означает, что при вызове метода выбор фактической реализации метода для выполнения происходит во время работы программы, поскольку статически недостаточно доступной информации. Это будет основано на имени метода, фактическом типе получателя (полиморфизм подтипа) и / или фактических типах аргументов (перегрузка) или даже более причудливом сопоставлении с образцом.

Динамическое связывание, согласно Википедии , является формой динамической диспетчеризации на языках OO, где фактический метод для вызова основан на имени операции и фактическом получателе во время выполнения.

Эта статья представляет статическое типизированное динамическое связывание (динамическое связывание с помощью статической системы типов) и динамическое связывание, полностью выполняемое во время выполнения. Он также рассматривает перегрузку как форму динамического связывания.

Я уверен, что вы можете найти много других статей, в которых говорится о динамической отправке или связывании. Насколько я могу судить, терминология не является фиксированной и «перегруженной». Лучше всего описать , что на самом деле происходит во время выполнения (точный процесс выбора конкретного метода), вместо того, чтобы пытаться правильно определить любой из этих двух терминов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...