27

У меня есть некоторые вопросы о концепции static polymporhism Я когда-нибудь слышал о; вы можете интерпретировать их прежде всего в контексте C++, но я был бы признателен за языковые агностические ответы, если это применимо (, тем самым помещая как C++, так и язык-агностик).Определение и реализация статического полиморфизма

  1. Как мы определить статический полиморфизм в целом? В качестве примера, я считаю, что функция std::sort из C++ считается статически полиморфной, поскольку она зависит от некоторого интерфейса, предоставляемого некоторыми объектами, которые ведут себя как итераторы, а также точное поведение по току по интерфейсу предоставленных итераторов и во время компиляции. Является ли это объяснением, как мы определяем статический полиморфизм, или это просто описание конкретного случая, и есть еще что-то для этого?

  2. Каковы общие шаблоны кода использования статического полиморфизма в C++? Также: есть ли только SP , достигнутый с помощью шаблонов в C++?

  3. Верно ли, что данная диаграмма классов UML не непосредственно описывают, как обрабатывается полиморфизм и, таким образом, он может быть, по меньшей мере, частично реализованы статически или динамически? Другими словами: Является ли выбор статического или динамического полиморфизма независимым от модели ООП и, следовательно, до того, чтобы разработчик решил?

  4. Является ли статический полиморфизм только C++-специфичным и связан с тем, как работают шаблоны? Если нет, то присутствует ли он в любых других основных языках кроме C++? Можем ли мы иметь эквивалент статического полиморфизма в Java, C#, что угодно, и принесет ли он какие-либо выгоды?

  5. Важнейшие ... Каковы фактические преимущества использования статического полиморфизма? Я думаю, мы можем согласиться с тем, что это снижает гибкость кода; каковы преимущества, кроме того - в случае C++ - сохранение одного разыменования указателя (стоимость виртуальной функции/указателя на функцию/делегата)? Что представляет собой класс проблем , где статический полиморфизм особенно полезен, правильный выбор для реализации?

+0

Мы можем согласиться с тем, что это снижает гибкость кода? –

+1

Я думаю, он имел в виду «сложность» или, возможно, «избыточность». –

+0

Нет, я имел в виду гибкость; предполагая, что все проекты со статическим полиморфизмом могут быть реализованы с помощью динамического полиморфизма, но не наоборот. Использование статического полиморфизма для конкретного случая предполагает, что в будущем может возникнуть необходимость переписать его динамически при изменении требований. Просто мое мышление – Kos

ответ

13
  1. Статическое полиморфное поведение type polymorphism, которое происходит во время компиляции, а не времени выполнения.
  2. Да.
  3. UML - это то, как классы взаимодействуют во время выполнения - я не верю, что существует формат UML для описания шаблонов, но я могу ошибаться.
  4. Насколько я знаю, это C++ специфический, но я не уверен, учитывая, что я не использовал каждый язык, когда-либо изобретенный. :) Это говорит о том, что языки JIT'd, такие как C# и Java, часто очень хороши в удалении влияния производительности косвенных вызовов в некоторых случаях, используя информацию, полученную во время выполнения, а не во время компиляции. Независимо от того, будет ли это во время компиляции или нет, это похоже на воздух, хотя ... в конце концов, это называется Just-In-Time Компилятор.
  5. Главное преимущество - просто производительность. Продолжительность полиморфизм может сделать все, что статический полиморфизм может сделать (на самом деле это может сделать больше), но он несет в себе стоимость косвенных вызовов (которые могут быть дорогими, если есть достаточно их)

Теперь шаблоны сами по себе имеют многие используют за пределами достижения полиморфизма времени компиляции - например, магия SFINAE, которая делает работу boost::bind, конечно, не является полиморфной, - это просто для того, чтобы сгладить несоответствия в самом языке.

+3

"2. Да." Как насчет перегрузки функций? –

+1

@Charles: Я никогда не слышал, чтобы кто-то перегружал «статический полиморфизм» раньше (хотя, я думаю, он подходит). –

+0

Это зависит от того, как вы отвечаете (1), конечно. –

5

Как мы определяем статический полиморфизм вообще?

Лучший способ понять это с помощью примеров. Policy Based Design - один из примеров статического полиморфизма. И, на мой взгляд, это очень мощный метод достижения статического полиморфизма.

Другой пример: Curiously recurring template pattern (CRTP), который также является мощной техникой.