Является ли полиморфизм строго теорией типов? - PullRequest
1 голос
/ 21 июня 2019

Я изучаю концепции ООП, которые на самом деле не имеют устоявшихся определений.

Я слышал разные вещи о полиморфизме и не могу решить, что правильно.

Большинство людей скажут, чтоэто теория типов.Это означает, что функция может принимать несколько типов параметров, которые имеют что-то общее.

Специальный полиморфизм связан с различными перегрузками одной и той же функции.

Параметрический полиморфизм - это универсальные функции.

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

Существует, казалось бы, иное определение.Есть те, кто говорит, что полиморфизм означает, что функция может иметь различные реализации (морфы / формы).В этом смысле ... - интерфейсные функции, - абстрактные функции абстрактных классов, - и виртуальные функции, которые могут быть переопределены подтипом ... все считаются полиморфными.

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

И, добавив к путанице, кто-то сказал, что только виртуальные функции полиморфны, потому что у них уже есть реализация.

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

Так что же такое полиморфизм в программировании?Это просто теория типов?

В этом вопросе я хотел бы обратиться к этому вопросу: https://stackoverflow.com/questions/25163683/polymorphism-and-interfaces-clarification#=

Это поднимает почти ту же проблему, но я не мог разобратьзаключение.

1 Ответ

0 голосов
/ 21 июня 2019

Да и нет.

Да, в классических наследуемых языках это работает именно так.

Нет, поскольку в других языках вызов метода для объекта может быть динамически разрешен.(например, путем поиска кода во время выполнения в списке объектов в виде поля, так называемого агрегата в терминах COM)

То, что этот метод существует в типе объекта, не определено в теории типов.По крайней мере, не универсальный.Язык даже не может быть напечатан.

Для статически унаследованной объектной модели это правда.IOW Typing (подтипирование / наследование, де-концепция виртуальных методов) - это реализация полиморфизма в языках с такой объектной моделью.Но не все языки делают.

Некоторые имеют полиморфизм диспетчеризации и могут добавить методы выполнения (например, цель C) или выяснить, что метод вообще существует (например, COM IDispatch)

Классическим тестом полиморфизма являетсякряква утиная ".Там, где у вас есть общее «животное», и вы вызываете метод «makeound», а если вы назначили утку, это «крякает».Таким образом, вы вызываете метод (передает сообщение на старом языке OO) для универсального объекта, и вы получаете поведение более специализированного объекта, назначенного ему.

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

В других языках универсальный объект может быть корневым объектом, и среда выполнения выяснит, если онимеет метод подбора.

...