Поліморфі́зм (з грец. πολύς «багато» + μορφή «форма») — концепція в програмуванні та теорії типів, в основі якої лежить використання єдиного інтерфейсу для різнотипних сутностей або у використанні однакового символу для маніпуляцій над даними різного типу[].
На противагу поліморфізму, концепція мономорфізму вимагає однозначного зіставлення.
Типи поліморфізму
- Спеціалізований поліморфізм — коли функції з однаковою назвою реалізовують різну логіку для різних типів вхідних параметрів. Підтримується в багатьох мовах програмування через перевантаження функцій.
- — коли код написаний без указування конкретного типу параметрів. В ООП це називається узагальнене програмування. Це основний тип поліморфізму в функційному програмуванні.
- — коли під одним ім'ям може використовуватись декілька типів похідних від одного базового. Основний тип поліморфізму в ООП.
Взаємодія параметричного поліморфізму і підтипів призводить до понять варіативності та обмеженої квантифікації.
Приклади
- У контексті об'єктно-орієнтованого програмування найпоширенішим різновидом поліморфізму є здатність екземплярів підкласу грати роль об'єктів батьківського класу, завдяки чому екземпляри підкласу можна використовувати там, де використовуються екземпляри батьківського класу.
- Прикладом спеціалізованого поліморфізму є бінарний оператор +, який може мати своїми аргументами дані різного типу: цілі числа, числа з рухомою комою, комплексні числа та навіть рядки:
- 1 + 2 — операнди цілого типу, результат цілого типу.
- 1.2 + 1.0e3 — операнди дійсних типів, результат дійсного типу
- «Бульдог» + «Носоріг» — операнди рядки, результат — конкатенований рядок
Спеціалізований поліморфізм
У наведеному далі прикладі на в залежності від типу переданих даних будуть застосовуватись різні методи:
class Point { private: int x, y; char x2,y2; public: void setXY(int _x, int _y) { x=_x; y=_y; } void setXY(char _x, char _y) { x2=_x; y2=_y; } };
Параметричний поліморфізм
Цей розділ потребує доповнення. (листопад 2018) |
Поліморфізм підтипів
Поліморфізм — один з трьох найважливіших механізмів об'єктно-орієнтованого програмування. Поліморфізм дозволяє створювати абстрактніші програми та підвищити коефіцієнт повторного використання коду[].
Спільні властивості об'єктів об'єднуються в систему, яку можуть називати по різному: інтерфейс, клас. Спільність має зовнішнє і внутрішнє вираження. Зовнішня спільність проявляється як однаковий набір методів з однаковими іменами і сигнатурами (типами аргументів і результатів)[].
Внутрішня спільність є однакова функціональність методів. Її можна описати інтуїтивно виразити у вигляді строгих законів, правил, яким повинні підкорятись методи[].
Наприклад:
#include <iostream> class Felid { public: virtual void meow() = 0; }; class Cat : public Felid { public: void meow() { std::cout << "Meowing like a regular cat! meow!\n"; } }; class Tiger : public Felid { public: void meow() { std::cout << "Meowing like a tiger! MREOWWW!\n"; } }; class Ocelot : public Felid { public: void meow() { std::cout << "Meowing like an ocelot! mews!\n"; } }; void do_meowing(Felid *cat) { cat->meow(); } int main() { Cat cat; Tiger tiger; Ocelot ocelot; do_meowing(&cat); do_meowing(&tiger); do_meowing(&ocelot); }
Статичний та динамічний поліморфізм
За часом вибору поліморфізм поділяють на статичний та динамічний:
- статичний поліморфізм (чи статична диспетчеризація) — якщо код, що буде виконуватись, вибирається під час компіляції;
- динамічний поліморфізм (чи ) — якщо код, що буде виконуватись, вибирається під час виконання програми ().
Перевагами статичного поліморфізму є:
- кращий статичний аналіз коду компілятором,
- менший розмір коду (через кращу оптимізацію коду та відсутність таблиці віртуальних методів)
- швидший час виконання.
Зате динамічний поліморфізм:
- більш гнучкий,
- дозволяє качину типізацію,
- дозволяє використовувати динамічно приєднані бібліотеки для похідних типів.
Динамічний поліморфізм, зазвичай, це поліморфізм підтипів.
Статичний поліморфізм це ad hoc чи параметричний поліморфізм, хоча його також можна реалізувати через наслідування та шаблонне метапрограмування — це називається дивно рекурсивний шаблон.
Див. також
Примітки
- Daniel P. Friedman, Mitchell Wand, Christopher T. Haynes (2001). Essentials of Programming Languages (англ.) (вид. друге). The MIT Press. ISBN .
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Це незавершена стаття з інформатики. Ви можете проєкту, виправивши або дописавши її. |
Ця стаття потребує додаткових для поліпшення її . (листопад 2018) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Polimorfizm Polimorfi zm z grec polys bagato morfh forma koncepciya v programuvanni ta teoriyi tipiv v osnovi yakoyi lezhit vikoristannya yedinogo interfejsu dlya riznotipnih sutnostej abo u vikoristanni odnakovogo simvolu dlya manipulyacij nad danimi riznogo tipu dzherelo Na protivagu polimorfizmu koncepciya monomorfizmu vimagaye odnoznachnogo zistavlennya Tipi polimorfizmuSpecializovanij polimorfizm koli funkciyi z odnakovoyu nazvoyu realizovuyut riznu logiku dlya riznih tipiv vhidnih parametriv Pidtrimuyetsya v bagatoh movah programuvannya cherez perevantazhennya funkcij koli kod napisanij bez ukazuvannya konkretnogo tipu parametriv V OOP ce nazivayetsya uzagalnene programuvannya Ce osnovnij tip polimorfizmu v funkcijnomu programuvanni koli pid odnim im yam mozhe vikoristovuvatis dekilka tipiv pohidnih vid odnogo bazovogo Osnovnij tip polimorfizmu v OOP Vzayemodiya parametrichnogo polimorfizmu i pidtipiv prizvodit do ponyat variativnosti ta obmezhenoyi kvantifikaciyi PrikladiU konteksti ob yektno oriyentovanogo programuvannya najposhirenishim riznovidom polimorfizmu ye zdatnist ekzemplyariv pidklasu grati rol ob yektiv batkivskogo klasu zavdyaki chomu ekzemplyari pidklasu mozhna vikoristovuvati tam de vikoristovuyutsya ekzemplyari batkivskogo klasu Prikladom specializovanogo polimorfizmu ye binarnij operator yakij mozhe mati svoyimi argumentami dani riznogo tipu cili chisla chisla z ruhomoyu komoyu kompleksni chisla ta navit ryadki 1 2 operandi cilogo tipu rezultat cilogo tipu 1 2 1 0e3 operandi dijsnih tipiv rezultat dijsnogo tipu Buldog Nosorig operandi ryadki rezultat konkatenovanij ryadokSpecializovanij polimorfizmDokladnishe Ad hoc polimorfizm U navedenomu dali prikladi na S v zalezhnosti vid tipu peredanih danih budut zastosovuvatis rizni metodi class Point private int x y char x2 y2 public void setXY int x int y x x y y void setXY char x char y x2 x y2 y Parametrichnij polimorfizmCej rozdil potrebuye dopovnennya listopad 2018 Polimorfizm pidtipivPolimorfizm odin z troh najvazhlivishih mehanizmiv ob yektno oriyentovanogo programuvannya Polimorfizm dozvolyaye stvoryuvati abstraktnishi programi ta pidvishiti koeficiyent povtornogo vikoristannya kodu dzherelo Spilni vlastivosti ob yektiv ob yednuyutsya v sistemu yaku mozhut nazivati po riznomu interfejs klas Spilnist maye zovnishnye i vnutrishnye virazhennya Zovnishnya spilnist proyavlyayetsya yak odnakovij nabir metodiv z odnakovimi imenami i signaturami tipami argumentiv i rezultativ dzherelo Vnutrishnya spilnist ye odnakova funkcionalnist metodiv Yiyi mozhna opisati intuyitivno viraziti u viglyadi strogih zakoniv pravil yakim povinni pidkoryatis metodi dzherelo Napriklad include lt iostream gt class Felid public virtual void meow 0 class Cat public Felid public void meow std cout lt lt Meowing like a regular cat meow n class Tiger public Felid public void meow std cout lt lt Meowing like a tiger MREOWWW n class Ocelot public Felid public void meow std cout lt lt Meowing like an ocelot mews n void do meowing Felid cat cat gt meow int main Cat cat Tiger tiger Ocelot ocelot do meowing amp cat do meowing amp tiger do meowing amp ocelot Statichnij ta dinamichnij polimorfizmZa chasom viboru polimorfizm podilyayut na statichnij ta dinamichnij statichnij polimorfizm chi statichna dispetcherizaciya yaksho kod sho bude vikonuvatis vibirayetsya pid chas kompilyaciyi dinamichnij polimorfizm chi yaksho kod sho bude vikonuvatis vibirayetsya pid chas vikonannya programi Perevagami statichnogo polimorfizmu ye krashij statichnij analiz kodu kompilyatorom menshij rozmir kodu cherez krashu optimizaciyu kodu ta vidsutnist tablici virtualnih metodiv shvidshij chas vikonannya Zate dinamichnij polimorfizm bilsh gnuchkij dozvolyaye kachinu tipizaciyu dozvolyaye vikoristovuvati dinamichno priyednani biblioteki dlya pohidnih tipiv Dinamichnij polimorfizm zazvichaj ce polimorfizm pidtipiv Statichnij polimorfizm ce ad hoc chi parametrichnij polimorfizm hocha jogo takozh mozhna realizuvati cherez nasliduvannya ta shablonne metaprogramuvannya ce nazivayetsya divno rekursivnij shablon Div takozhInkapsulyaciya programuvannya Uspadkuvannya programuvannya Virtualni metodiPrimitkiDaniel P Friedman Mitchell Wand Christopher T Haynes 2001 Essentials of Programming Languages angl vid druge The MIT Press ISBN 0 262 06217 8 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Ce nezavershena stattya z informatiki Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno listopad 2018