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

Садржај обрисан Садржај додат
мНема описа измене
Нема описа измене
Ред 2:
У [[Програмски језик|програмским језицима]], '''полиморфизам''' ({{Јез-грч|πολύς}}, што значи "много" и {{Јез-грч|μορφή}}, што значи „форма, облик“) представља обезбеђивање јединственог интерфејса према ентитетима различитих [[Википедија:Вики гимназијалац/Rad sa datotekama|тип]]ова.<ref>
{{cite web|url=http://www.stroustrup.com/glossary.html#Gpolymorphism|author=Bjarne Stroustrup|title=Bjarne Stroustrup's C++ Glossary|date=February 19, 2007}}</ref> . ''Полиморфни тип'' је онај тип чије се операције могу применити на вредности неког другог типа или више типова.<ref name="Luca">{{Cite journal | last1 = Cardelli | first1 = Luca| last2 = Wegner | first2 = Peter| title = On understanding types, data abstraction, and polymorphism|date=December 1985 | url = http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf| location = New York, NY, USA}}</ref> Постоји неколико фундаментално различитих типова полиморфизма:
* ''[[Ад-хок полиморфизам]]'': : почива на особини неких програмских језика да допуштају вишезначност имена функција и оператора ({{Јез-енг|overloading}}).
 
* ''[[Параметарски полиморфизам]]'': када је код написан без помињања било ког специфичног типа и стога га може користити већи број нових типова. Унутар заједнице [[Објектно-оријентисано програмирање|објектно-оријентисаног програмирања]], овај вид полиморфизма је познат као [[Генеричко програмирање|генеричко програмирање]], док се у [[Функционално програмирање|функционалном програмирању]] користи термин "полиморфизам".
 
* ''[[Хијерархијски полиморфизам]]'' (познат и као ''полиморфизам подтипова''): kада име означава инстанце различитих класа повезаних неком заједничком надкласом.<ref name="gbooch">Booch, et al 2007 ''Object-Oriented Analysis and Design with Applications.'' Addison-Wesley http://rolliawati.dosen.narotama.ac.id/files/2012/03/object-oriented-analysis-and-design-with-applications-3rd-edition.9780201895513.27854.pdf. </ref> У објектно-оријентисаном програмирању, ово се често назива једноставан ''полиморфизам''.
 
* ''[[Имплицитни полиморфизам]]'': карактеристичан је за [[Функционално програмирање|функционалне језичке парадигме]]. Представља уопштење параметарског полиморфизма. Дозвољава писање кода без навођења [[Tipovi podataka|типова]]. Типови се одређују у фази извршавања.
Ред 15:
==Типови полиморфизма==
===Ад-хок полиморфизам===
[[Кристофер Стрејчи]]<ref name="Strachey "/> је изабрао термин ''ад-хок полиморфизам'' да означи полиморфне функције које се могу применити на аргументе различитих типова, али које се понашају другачије у зависности од типа аргумента на који се примењују (такође познате као превазилажењепреоптерећење функције). Термин "[[ад-хок]]" упућује на то да овај тип полиморфизма није основно обележје типа система. У програмском језику [[Паскал (програмски језик)|Паскал]] на пример, функција <code>Add</code> наизглед ради генерички са више врста типова када се гледају само позиви, али у ствари представља потпуно различите функције[[Кристофер Стрејчи]]<ref name="Strachey "/> је изабрао термин ''ад-хок полиморфизам'' да означи полиморфне функције које се могу применити на аргументе различитих типова, али које се понашају другачије у зависности од типа аргумента на који се примењују (такође из перспективе компајлера у сваком смислу:
 
<source lang=pascal>
Ред 42:
===Параметарски полиморфизам===
 
''Параметарски полиморфизам'' почива на употреби тзв. типских променљивих. Типске променљиве се користе за симболичко означавање типова вредности, променљивих и израза. Сваки пут када се употреби код, који је написан уз употребу параметарског полиморфизма, симбилички типови (типске променљиве) се замењују конкретним типовима и програм се преводи у неполиморфном облику. Да би превођење било успешно, неопходно је да у свим деловима тог полиморфног кода замењивање симболичких типова конкретним типовима производи исправан програмски код. Ако то није случај, тј. ако је за конкретан тип изабран неки тип за који дати програмски код није исправан, онда ће преводилац пријавити грешку.
 
Одређивање конкретних типова се може изводити експлицитно, навођењем типа, или имплицитно, на основу правила превођења конкретног програмског језика.<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>
Ред 61:
 
Подршка за параметарски полиморфизам постоји и у неколико објектно-оријентисаних језика. На пример, подршка за параметарски полиморфизам у програмском језику Ц++ и Д је имплементирана кроз концепт шаблона функција и класа. Шаблон функције представља функцију у којој се употребљава неки параметарски (симболички) тип. Слично, шаблон класе је дефиниција класе која почива на употрби једног или више симболичких типова:
 
 
<source lang=csharp>
Линија 78 ⟶ 79:
 
Џон Ч. Рејнолдс (и касније Жан-Ив Жирар) је формално развио појам полиморфизма као проширење ламбда рачуна (који се зове полиморфни ламбда рачун или [[Систем Ф]]). Било која параметарски полиморфна функција је нужно ограниченa, радeћи на типовима података уместо на њиховим вредностима, што је довело до концепта параметризације.
 
 
===Хијерархијски полиморфизам===
 
Хијерархијски полиморфизам користи успостављене хијерархијске односе надтип и подтип међу класама као средство оставаривања полиморфизма. Он је последица особине објектно-оријентисаних програмских језика да програмски код, који је написан да ради са објектима једне класе, може да ради и са објектима свих њених поткласа. Нпр. функција написана тако да узима објекат одређеног типа ''Т'', али да исправно ради и уколико јој се пошаље објекат који припада типу ''С'' који је подтип типа ''Т'' (по принципу супституције који је формулисала [[Барбара Лисков|Лисков]] ). Овај тип односа се понекад означава као ''C''<:''Т''. С друге стране, каже се да је ''Т'' супертип од ''С'', означавамо ''Т'':>''С''. Подтип полиморфизма се обично решава динамички (види доле).
 
 
У следећем примеру су авиони, бродови и аутомобили подтипови превозног средства. Процедура ispisiMesto() прихвата превозно средство, али ће исправно радити и ако се преноси подтип:
Линија 121 ⟶ 124:
 
На пример, ако су <code>Number</code>, <code>Rational</code>, и <code>Integer</code> типови такви да <code>Number</code>:> <code>Rational</code> и <code>Number</code>:> <code>Integer</code>, функција која као аргумент прима <code>Number</code> ће радити једнако добро када прима <code>Integer</code> или <code>Rational</code>. Стварни тип објекта може бити скривен од стране клијената у [[Црна кутија|црну кутију]], и приступа му се преко објекта идентитета. У ствари, ако је тип <code>Number</code> абстрактан, можда неће ни бити могуће приступити објекту чија је већина пореклом од типа <code>Number</code>. Ова врста хијерархије типа је позната - нарочито у контексту [[Scheme (programski jezik)|Шема програмског језика]]-као нумерички торањ, и обично садржи још много типова.
 
 
[[Објектно-оријентисано програмирање|Објектно-оријентисани језици]] почивају на концептима [[класе]] и [[Наслеђивање (објектно-оријентисано програмирање)|наслеђивања класа]]. Наслеђивање класа није ништа друго до декларисање да једна класа представља специјалан случај (или поткласу) друге класе, тј. да друга класа представља уопштење (тј. наткласу) прве класе. Релација поткласа је специјалан случај релације подтип, а релација наткласа спрецијалан случај релације надтип. <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>
Линија 127 ⟶ 131:
 
''Имплицитни полиморфизам'' подразумева да се при писању кода уопште не наводе типови вредности и израза. Претпоставља се да ће преводилац анализирати сваки конкретан сегмент програмског кода и сам закључити за које типове може да се преводе. Ако неки део кода може успешно да се преведе за више различитих типова, онда се преводи и користи као полиморфан део кода.
 
 
Имплицитни полиморфизам се користи у великом броју [[Dinamički programski jezik|динамичких програмских језика]], код којих се проверавање типова (а тиме и проверавање исправности кода) одлаже до фазе извршавања програма (на пример [[Lisp (programski jezik)|Лисп]]), али и код значајног броја програмских језика код којих се статичком провером типова у фази превођења тачно установљава (потенцијално полиморфан) тип сваког израза у коду.
Линија 141 ⟶ 146:
Полиморфизами се могу разликовати према томе која је имплементација изабрана - статично (у време компајлирања) или динамично (у време извршавања, обично преко виртуелне функције). Ово је познатије као статичко и динамичкo спајање, а одговарајући облици полиморфизма се у складу са тим називају ''статички полиморфизам'' и ''динамички полиморфизам''.
 
 
Статички полиморфизам се извршава брже, али захтева додатну подршку компајлера. Статички полиморфизам омогућава већу статичку анализу: приликом компајлирања (посебно за оптимизацију), анализу изворног кода и анализу коју врше програмери. Динамички полиморфизам је флексибилнији, али спорији - на пример, , динамички полиморфизам омогућава кодирање без експлицитно декларисаних типова ({{Јез-енг|duck typing}}), а динамички повезане библиотеке омогућавају њихово коришћење над објектима без познавања њиховог пуног садржаја.
 
 
Статички полиморфизам се обично јавља у ад-хоку и параметарском полиморфизму, док је динамички полиморфизам уобичајен за подтипизирани полиморфизам. Међутим, могуће је користити статички полиморфизам са подтипизираним полиморфизмом помоћу софистицираних употреба [[Шаблон метапрограмирања|шаблона метапрограмирања]].