Динамическая отправка и привязка

Являются ли динамические отправки и динамические привязки одинаковыми?

Спасибо

Мацей

Ответы

Ответ 1

Нет.

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

Вот пример в С#.

class Foo { 
  public override string ToString() { return "foo 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});
}

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

То, что у них больше всего общего, - это обе операции (вероятно) зависят от типа среды выполнения объекта.

ИЗМЕНИТЬ

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

Ответ 2

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

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

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

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