13.02. virtual, override i polimorfizam
deo 1 – POJAM I UPOTREBA virtual I override
1. Uvod
U prethodnim lekcijama učenici su učili o baznim i izvedenim klasama, apstraktnim klasama, interfejsima
Međutim, polimorfizam zahteva da bazna klasa dozvoli metodama da se redefinišu.
Tu na scenu stupa ključna reč virtual.
Virtualna metoda omogućava da izvedena klasa prepiše ponašanje metode bazne klase, što je osnova za polimorfizam.
2. Virtualna metoda
Definicija:virtual metoda je metoda u baznoj klasi koja ima implementaciju, ali može da bude prepisana (override) u izvedenoj klasi.
class Vozilo
{
public virtual void Pokreni()
{
Console.WriteLine("Vozilo se pokreće");
}
}
3. Override u izvedenoj klasi
class Automobil : Vozilo
{
public override void Pokreni()
{
Console.WriteLine("Automobil se pokreće");
}
}
Vozilo v = new Automobil();
v.Pokreni(); // Automobil se pokreće
📌 Iako je tip reference Vozilo, izvršava se override metoda iz Automobil.
Bez virtual u baznoj klasi, ovo ne bi radilo.
4. Zadatak za vežbu
Zadatak:
Napraviti baznu klasu Zivotinja sa virtual metodom OglasiSe().
Izvedene klase: Pas, Macka.
Testirati polimorfizam sa referencama baznog tipa.
Rešenje:
class Zivotinja
{
public virtual void OglasiSe()
{
Console.WriteLine("Zvuk životinje");
}
}
class Pas : Zivotinja
{
public override void OglasiSe()
{
Console.WriteLine("Av av");
}
}
class Macka : Zivotinja
{
public override void OglasiSe()
{
Console.WriteLine("Mjau");
}
}
// Test
Zivotinja z1 = new Pas();
Zivotinja z2 = new Macka();
z1.OglasiSe(); // Av av
z2.OglasiSe(); // Mjau
deo 2 – POLIMORFIZAM U NIZOVIMA
1. Polimorfizam sa virtual metodama
Zivotinja[] zivotinje = new Zivotinja[3];
zivotinje[0] = new Pas();
zivotinje[1] = new Macka();
zivotinje[2] = new Pas();
foreach (Zivotinja z in zivotinje)
{
z.OglasiSe();
}
Rezultat:
Av av
Mjau
Av av
📌 Jedna referenca – različito ponašanje objekata.
2. Primer poslovne logike
class Radnik
{
public virtual double Plata()
{
return 0;
}
}
class Programer : Radnik
{
public override double Plata()
{
return 80000;
}
}
class Direktor : Radnik
{
public override double Plata()
{
return 120000;
}
}
Radnik[] radnici = { new Programer(), new Direktor() };
foreach (Radnik r in radnici)
{
Console.WriteLine(r.Plata());
}