Что такое «неограниченный динамический полиморфизм» в Smalltalk? - PullRequest
2 голосов
/ 15 февраля 2012

Что такое «неограниченный динамический полиморфизм» в Smalltalk?Может ли кто-нибудь привести пример?

Упоминается в этой книге : C ++ шаблоны: полное руководство , с.238.

Ответы [ 3 ]

7 голосов
/ 15 февраля 2012

См. В c ++: полиморфизм, реализуемый посредством наследования, ограничен и динамичен:

  • Ограничен означает, что интерфейсы типов, участвующих в полиморфном поведении, предопределены конструкциейобщий базовый класс (другие термины для этой концепции являются инвазивными или навязчивыми).
  • Динамический означает, что привязка интерфейсов выполняется во время выполнения (динамически).

Реализован полиморфизмШаблоны via являются неограниченными и статичными:

  • Неограниченный означает, что интерфейсы типов, участвующих в полиморфном поведении, не предопределены (другие термины для этого понятия неинвазивны или неинтрузивны).
  • Статический означает, что привязка интерфейсов выполняется во время компиляции (статически).

В Smalltalk объект может решить, хочет ли он и как реагировать на сообщение, отправляемое во время выполнения.

1 голос
/ 15 февраля 2012

unbounded dynamic polymorphism не зависит от языка.Поэтому я предполагаю, что ваш вопрос

Что такое «неограниченный динамический полиморфизм» в Smalltalk?

Можно упростить до

Что такое"неограниченный динамический полиморфизм"?

Что объясняется в упомянутой вами документации.Я думаю, вы спрашиваете, что делает smalltalk неограниченным динамическим полиморфным языком?Прежде всего, я не отдаю должное термину «связанный» или «не связанный».Это определение мне не понятно.

Например, предположим, у меня есть шаблон класса A, если вы решите создать его экземпляр как A<int>, он связан, здесь нет недетерминированных вещей.Даже для класса А интерфейс предопределен.Я бы сказал, что шаблон - это способ иметь полиморфный тип в том же смысле, что и система типов Хаскелла.

Я думаю, что использование термина «несвязанный / связанный» результат плохого определения того, что такое полиморфизм.Полиморфизм может применяться к типу или интерфейсу.

Полиморфный интерфейс - это интерфейс, который может быть реализован при выборе другого поведения.Например, объект a, b, c может по-разному реагировать на интерфейс Copy.

Полиморфный тип - это тип с параметром.

Как вы можете видеть, полиморфный интерфейс и полиморфный тип не связаны между собой двумя вещами.

Другими словами, для классификации C ++ и smalltalk я бы сказал, что C ++ является языком статического типа с полиморфным типом.А smalltalk - это язык динамического типа.И для этого не нужна система полиморфной типизации, поскольку полиморфный тип имеет смысл только в языке статического типа.

1 голос
/ 15 февраля 2012

В C ++ метод, который вы вызываете для объекта, определяется во время компиляции. Для невиртуального метода это просто, для виртуального вызова это делается с помощью поиска в vtable. Тем не менее, ключевая вещь с виртуальным вызовом (где происходит их полиморфизм) заключается в том, что компилятор решил, что он является допустимым для вызова метода, и он знает, какую запись в vtable использовать. В

В Smalltalk вызов разрешается во время выполнения. Тип вызываемого объекта может варьироваться между вызовами, и поэтому правильный метод (который мог быть переопределен) не может быть привязан во время компиляции (несвязанный бит) и должен быть разрешен (динамический бит) во время выполнения.

...