Полиморфизам (рачунарство) — разлика између измена

м
Bot: Pretvaranje običnih izvora koristeći ref imena da bi se izbjegli duplikati (pogledaj također FAQ); козметичке измене
м (Bot: Pretvaranje običnih izvora koristeći ref imena da bi se izbjegli duplikati (pogledaj također FAQ); козметичке измене)
* ''[[Ад-хок полиморфизам]]'': почива на особини неких програмских језика да допуштају вишезначност имена функција и оператора ({{Јез-енг|overloading}}).
 
* ''[[Параметарски полиморфизам]]'': када је код написан без помињања било ког специфичног типа и стога га може користити већи број нових типова. Унутар заједнице [[Објектно-оријентисано програмирање|објектно-оријентисаног програмирања]], овај вид полиморфизма је познат као [[Генеричко програмирање|генеричко програмирање]], док се у [[Функционално програмирање|функционалном програмирању]] користи термин "полиморфизам".
 
* ''[[Хијерархијски полиморфизам]]'' (познат и као ''полиморфизам подтипова''): kада име означава инстанце различитих класа повезаних неком заједничком надкласом.<ref name="gbooch">Booch, et al 2007 ''Object-Oriented Analysis and Design with Applications.'' Addison-Wesley.</ref> У објектно-оријентисаном програмирању, ово се често назива једноставан ''полиморфизам''.
* ''[[Имплицитни полиморфизам]]'': карактеристичан је за [[Функционално програмирање|функционалне језичке парадигме]]. Представља уопштење параметарског полиморфизма. Дозвољава писање кода без навођења [[Tipovi podataka|типова]]. Типови се одређују у фази извршавања.
 
== Историја ==
Ад-хок полиморфизам и параметарски полиморфизам су првобитно описани у низу предавања, ''Основни концепти програмских језика'', које је 1967. године забележио британски прогарамер [[Кристофер Стрејчи]].<ref name="Strachey ">C. Strachey – ''Fundamental Concepts in Programming Languages'' http://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf</ref> Године 1985. [[Петер Вегнер]] и [[Лука Кардели]] су увели појам ''укључивања полиморфизма'' у модел подтипова и [[Наслеђивање (објектно-оријентисано програмирање)|наслеђивања]].<ref name="Luca"/> Међутим, имплементације полиморфизма подтипова и наслеђивања воде порекло од појма "инклузија полиморфизма", након што се појавио програмски језик [[Симула]] 1967. године.
 
== Типови полиморфизма ==
=== Ад-хок полиморфизам ===
познате као преоптерећење функције). Термин "[[ад-хок]]" упућује на то да овај тип полиморфизма није основно обележје типа система. У програмском језику [[Паскал (програмски језик)|Паскал]] на пример, функција <code>Add</code> наизглед ради генерички са више врста типова када се гледају само позиви, али у ствари представља потпуно различите функције[[Кристофер Стрејчи]]<ref name="Strachey "/> је изабрао термин ''ад-хок полиморфизам'' да означи полиморфне функције које се могу применити на аргументе различитих типова, али које се понашају другачије у зависности од типа аргумента на који се примењују (такође из перспективе компајлера у сваком смислу:
 
<source lang=pascal>
Имплицитна конверзија се такође дефинише као облик полиморфизма, и назива се принудан полиморфизам.<ref name="Luca"/><ref name="Tucker2004">{{cite book|author=Allen B. Tucker|title=Computer Science Handbook, Second Edition|url=https://books.google.com/books?id=9IFMCsQJyscC&pg=SA91-PA5|date=28 June 2004|publisher=Taylor & Francis|isbn=978-1-58488-360-9|pages=91–}}</ref>
 
=== Параметарски полиморфизам ===
 
''Параметарски полиморфизам'' почива на употреби тзв. типских променљивих. Типске променљиве се користе за симболичко означавање типова вредности, променљивих и израза. Сваки пут када се употреби код, који је написан уз употребу параметарског полиморфизма, симбилички типови (типске променљиве) се замењују конкретним типовима и програм се преводи у неполиморфном облику. Да би превођење било успешно, неопходно је да у свим деловима тог полиморфног кода замењивање симболичких типова конкретним типовима производи исправан програмски код. Ако то није случај, тј. ако је за конкретан тип изабран неки тип за који дати програмски код није исправан, онда ће преводилац пријавити грешку.
</source>
 
Подршка за параметарски полиморфизам постоји и у неколико објектно-оријентисаних језика. На пример, подршка за параметарски полиморфизам у програмском језику Ц++ и Д је имплементирана кроз концепт шаблона функција и класа. Шаблон функције представља функцију у којој се употребљава неки параметарски (симболички) тип. Слично, шаблон класе је дефиниција класе која почива на употрби једног или више симболичких типова:
 
 
 
 
=== Хијерархијски полиморфизам ===
 
Хијерархијски полиморфизам користи успостављене хијерархијске односе надтип и подтип међу класама као средство оставаривања полиморфизма. Он је последица особине објектно-оријентисаних програмских језика да програмски код, који је написан да ради са објектима једне класе, може да ради и са објектима свих њених поткласа. Нпр. функција написана тако да узима објекат одређеног типа ''Т'', али да исправно ради и уколико јој се пошаље објекат који припада типу ''С'' који је подтип типа ''Т'' (по принципу супституције који је формулисала [[Барбара Лисков|Лисков]] ). Овај тип односа се понекад означава као ''C''<:''Т''. С друге стране, каже се да је ''Т'' супертип од ''С'', означавамо ''Т'':>''С''. Подтип полиморфизма се обично решава динамички (види доле).
 
 
[[Објектно-оријентисано програмирање|Објектно-оријентисани језици]] почивају на концептима [[класе]] и [[Наслеђивање (објектно-оријентисано програмирање)|наслеђивања класа]]. Наслеђивање класа није ништа друго до декларисање да једна класа представља специјалан случај (или поткласу) друге класе, тј. да друга класа представља уопштење (тј. наткласу) прве класе. Релација поткласа је специјалан случај релације подтип, а релација наткласа спрецијалан случај релације надтип. <ref name="Malkov">S.Malkov-''Odlomak iz knjige Razvoj softvera ''http://poincare.matf.bg.ac.rs/~smalkov/files/rs.r290.2015/public/Predavanja/Razvoj%20softvera.2014.06%20-%20Parametarski%20polimorfizam.pdf</ref>
 
=== Имплицитни полиморфизам ===
 
''Имплицитни полиморфизам'' подразумева да се при писању кода уопште не наводе типови вредности и израза. Претпоставља се да ће преводилац анализирати сваки конкретан сегмент програмског кода и сам закључити за које типове може да се преводе. Ако неки део кода може успешно да се преведе за више различитих типова, онда се преводи и користи као полиморфан део кода.
<code>#define max(x,y) ((x)>(y) ? (x) : (y))</code>
 
онда написани макро можемо да употребимо за израчунавање већег од два аргумента за било које типове података за које је дефинисан оператор поређења „>“.<ref name="Malkov">S.Malkov-''Odlomak iz knjige Razvoj softvera ''http://poincare.matf.bg.ac.rs/~smalkov/files/rs.r290.2015/public/Predavanja/Razvoj%20softvera.2014.06%20-%20Parametarski%20polimorfizam.pdf</ref>
 
== Аспекти имплементације ==
=== Статички и динамички полиморфизам ===
 
Полиморфизами се могу разликовати према томе која је имплементација изабрана - статично (у време компајлирања) или динамично (у време извршавања, обично преко виртуелне функције). Ово је познатије као статичко и динамичкo спајање, а одговарајући облици полиморфизма се у складу са тим називају ''статички полиморфизам'' и ''динамички полиморфизам''.
 
 
Статички полиморфизам се извршава брже, али захтева додатну подршку компајлера. Статички полиморфизам омогућава већу статичку анализу: приликом компајлирања (посебно за оптимизацију), анализу изворног кода и анализу коју врше програмери. Динамички полиморфизам је флексибилнији, али спорији - на пример, динамички полиморфизам омогућава кодирање без експлицитно декларисаних типова ({{Јез-енг|duck typing}}), а динамички повезане библиотеке омогућавају њихово коришћење над објектима без познавања њиховог пуног садржаја.
 
 
 
 
== Референце ==
{{reflist|30em}}
 
[[Категорија:Полиморфизам ]]
[[Категорија:Функционално програмирање]]
[[Категорија:Објектно-оријентисано програмирање]]
363.220

измена