Полиморфизам
Уз наслеђивање и енкапсулацију, полиморфизам (грч. πολύ - много, μορφή - облик) представља један од три стуба ООП. Уопштено, полиморфизам дозвољава креирање јединственог интерфејса ка различитим ентитетима. Конкретно, у објектно-оријентисаном програмирању полиморфизам се манифестује у различитим облицима. На пример, полиморфизам омогућује да се:
- преоптерећују методе у истој класи, где одабир методе врши компајлер на основу потписа методе, односно на основу прослеђених аргумената (статички полиморфизам),
- преоптерећују оператори, где се дефинишу нова понашања за постојеће операторе за рад са кориснички дефинисаним типовима (такође статички полиморфизам),
- преовладавају методе у изведеним класама, које су дефинисане у базној класи, где се одабир методе врши динамички у време извршавања програма на основу типа објекта (динамички полиморфизам).
Статички полиморфизам
Преклапање метода у истој класи може се представити једноставним примером у класи за рад са правоуглим троугловима. Обим правоуглог троугла можеш израчунати ако су познате све три странице (\(a\), \(b\) и \(c\)), или, захваљујући Питагориној теореми, ако су познате катете (\(O=a+b+\sqrt{a^2+b^2}\)). То значи да класа може да има две методе Obim
- једну која прихвата три аргумента (\(a\), \(b\) и \(c\)) и другу која прихвата два аргумента (\(a\) и \(b\)). Одабир позване методе врши се на основу потписа методе, односно на основу прослеђених аргумената.
Постоји пуно примера где можеш користити преоптерећене операторе. Рецимо, ако треба да сабираш комплексне бројеве, можеш да преоптеретиш оператор за сабирање +
. Уместо да враћа збир два броја, на пример \(br_1+br_2\), преоптерећени оператор за сабирање који сабира комплексне бројеве враћао би збир реалних и збир имагинарних делова два комплексна броја \(br_{re_1}+br_{re_2},br_{im_1}+br_{im_2}\).
Динамички полиморфизам
Надјачавање метода односи се на могућност надјачавања или преовладавања метода базне класе у изведеним класама. Тиме се омогућава да се у изведеним класама дефинишу специфичне имплементације метода дефинисаних у базним класама. Метода базне класе која треба да се надјача дефинише се као виртуелна метода, а метода изведене класе која надјачава виртуелну методу базне класе дефинише се као надјачана метода.
Динамички полиморфизам може се применити у много ситуација. На пример, систем за процесирање плаћања може да подржава различите методе плаћања. Тако виртуелна метода naplati()
у базној класи, може да буде надјачана у изведеним класама, како би се имплементирало готовинско плаћање, плаћање картицом, плаћање различитим криптовалутама итд.