Поскольку несколько человек уже привели прекрасные примеры полиморфизма, я предложу другую точку зрения, которая действительно помогла мне понять это.
В функциональном программировании функции являются первоклассными концепциями в отличие от ООП, где объекты являются высшими.
Полиморфизм для ООП - это то же самое, что сопоставление с образцом для ФП. Вот функция, которая использует сопоставление с образцом (используя синтаксис стиля ML).
let f x =
match x with
| T -> //do stuff with a T to return some value
| S -> //do stuff with an S to return some value
| U -> //do stuff with a U to return some value
| V -> //do stuff with a V to return some value
Таким образом, когда вы используете функцию f, вы можете передавать ей объект типа T, S, U или V. В строго типизированных языках FP, таких как F #, тип x обозначается T|S|U|V
. Такие типы обычно называются типами сумм или теговыми союзами.
Если мы исправим ваш пример, чтобы сделать Human
абстрактным классом, тогда станет ясно, что полиморфизм в ООП просто дает вам способ выражения типа суммы.
Таким образом, CleanTheRoom
- это функция, которая принимает тип Human
. Но Human
- это просто имя для типа Man|Woman|Child
, который является типом суммы. Большая разница между языками, такими как C #, и функциональными языками, такими как F #, заключается в том, что один рассматривает объекты как вещи верхнего уровня, а другой - как функции верхнего уровня. Кроме того, все в языках ООП, таких как C #, должны иметь имена. На функциональном языке мы можем обозначить тип Man|Woman|Child
без необходимости явно называть его.
Ключ не в том, чтобы думать о коде как о различных методах CleanTheRoom
, а о том, чтобы CleanTheRoom
воспринимать как один метод, принимающий тип Man|Woman|Child
(который называется Human
). Полиморфизм - это просто деталь реализации.
Таким образом, полиморфизм (особенно с абстрактными классами) в основном просто дает вам возможность называть типы сумм и выполнять сопоставление с образцом.
См: