Razlika između abstract i virtual funkcija u C# programskom jeziku

Saturday, January 02, 2016


Ako ste se do sada susreli sa OOP (Objektno orijentisanim programiranjem), postoji velika mogućnost da ste imali dodira sa virtualnim i abstraktnim funkcijama u naslijeđivanju. Kada se radi o abstraktnim i virtualnim funkcijama ova dva pojma često izazivaju nedoumice kod programera koji tek spoznaju OOP i pravo je pitanje koja je razlika između njih i kada koju od njih zapravo treba koristiti. Kratka napomena: "Namjerno koristim riječ abstraktna, a ne apstraktna"

Ukratko u nekoliko rečenica:

  • Abstraktne funkcije, se moraju preklopiti u nasljeđenim klasama i nemaju svoju implementaciju (tijelo funkcije)
  • Virtualne funkcije imaju implementaciju, mogu a i ne moraju biti preklopljene

Ovo sve poprima jako dobar smisao kada u priču uvedemo polimorfizam, ako imamo određene funkcije u našoj baznoj klasi nakon nasljeđivanja i kreiranja instanci naše bazne klase imamo potrebu da promjenimo ponašanje tih funkcija kada se one pozivaju iz izvedenih klasa. Kod virtualnih klasa u implementaciju izvedenih klasa imamo mogućnost da pozivamo funkcije iz baznih klasa, dok to kod abstraktnih nije slučaj iz razloga što abstraktne funkcije nemaju implementaciju.

Na slijedećoj slici imamo abstraktnu klasu Osoba sa par atributa i abstraktnom funkcijom PredstaviSe(). Ispod klase Osoba (sve klase su mi u istom fajlu zbog potreba blog posta, inače bi bile odvojene svaka zasebno)... se nalazi izvedena klasa Fudbaler sa svojim konstruktorom, ako ostavim ovako kako stoji, Visual Studio nam prijavljuje grešku da u našoj klasi Fudbaler nemamo implementiranu funkciju PredstaviSe().



Abstraktna klasa nam "naređuje" da moramo implementirati sve abstraktne funkcije u izvdenoj koje se nalaze u baznoj klasi. Tako da naše dvije klase sada izgledaju ovako:



Na sljedećoj slici vidimo implementaciju klase sa virtualnim funkcijama i nasljeđivanje u izvedenoj:


Na slici vidimo da smo u klasi Fudbaler implementirali funkciju PredstaviSe(), mada to nismo morali uraditi jer bazna klasa nije abstraktna. Važno za naglasiti je da koristimo override (preklapanje) ključnu riječ u implementaciji izvedene klase time navodimo da preklapamo baznu funkciju i u programu pri pozivu ovih funkcija pozivat će se ona preklopljena funkcija iz najizvedenije klase.

Jedna od stvarih koje su bitne da se kažu jeste da sa abstraktnom klasom ne možemo imati kreirane objekte tj. instance, ali možemo imati nešto ovako:


Ovakav način implementacije klase "Osoba" nam je dopustio pojam polimorfizma u Objektno orijentisanom programiranju.

Zaključak je sljedeće:
  • Abstraktne funkcije, se moraju preklopiti u nasljeđenim klasama i nemaju svoju implementaciju (tijelo funkcije), te ne možemo kreirati objekte te klase (ako je abstraktna klasa)
  • Virtualne funkcije imaju implementaciju, mogu, a i ne moraju biti preklopljene

Nadam se da vam je ovaj tutorijal bio od pomoći i da vam je približio i da sam objasnio ključnu razliku između abstraktne i virtualne klase u C# programskom jeziku (pa i u još nekim sličnim programskim jezicima...).

Pozdrav! Almir Vuk | AV Development

You Might Also Like

0 comments