30.01. / 06.02. Konstruktori izvedenih klasa
U objektno orijentisanom programiranju, klasa predstavlja šablon na osnovu koga se kreiraju objekti. Da bi objekat mogao da se koristi, mora biti pravilno inicijalizovan, odnosno njegova polja i svojstva moraju dobiti početne vrednosti. Za tu svrhu koriste se konstruktori.
Kada se koristi nasleđivanje, situacija postaje složenija, jer objekat izvedene klase u sebi sadrži i deo koji je nasledio od bazne (osnovne) klase. Zbog toga se prilikom kreiranja objekta izvedene klase uvek mora inicijalizovati i deo koji je nasleđen od bazne klase, što se radi pozivanjem konstruktora bazne klase, bilo implicitno, bilo eksplicitno.
Pojam konstruktora - da ponovimo
Konstruktor je specijalna metoda klase koja:
- ima isto ime kao klasa,
- nema povratnu vrednost (čak ni
void), - automatski se poziva prilikom kreiranja objekta pomoću operatora
new.
Primer jednostavnog konstruktora:
class Osoba
{
public string Ime;
public Osoba()
{
Ime = "Nepoznato";
}
}
Kada se izvrši naredba:
Osoba o = new Osoba();
automatski se poziva konstruktor klase Osoba.
Konstruktori i nasleđivanje
Kada klasa nasleđuje drugu klasu, dobija njene članove (polja, metode, svojstva), ali ne nasleđuje konstruktore.
Međutim, konstruktor bazne klase se uvek izvršava prilikom kreiranja objekta izvedene klase.
Primer:
class Osoba
{
public Osoba()
{
Console.WriteLine("Pozvan konstruktor klase Osoba");
}
}
class Ucenik : Osoba
{
public Ucenik()
{
Console.WriteLine("Pozvan konstruktor klase Ucenik");
}
}
Ako se u Main metodi napiše:
Ucenik u = new Ucenik();
Izlaz će biti:
Pozvan konstruktor klase Osoba
Pozvan konstruktor klase Ucenik
👉 Zaključak: Prvo se uvek poziva konstruktor bazne klase, a zatim konstruktor izvedene klase.
Implicitno pozivanje konstruktora bazne klase
Ako bazna klasa ima konstruktor bez parametara, on se automatski poziva, čak i ako to nije eksplicitno navedeno u izvedenoj klasi, prilikom kreiranja objekta izvedene klase pomoću konstruktora bez parametara. To je moglo da se vidi u prethodnom primeru, a u nastavku je još jedan sličan primer:
class Vozilo
{
public Vozilo()
{
Console.WriteLine("Kreirano vozilo");
}
}
class Automobil : Vozilo
{
public Automobil()
{
Console.WriteLine("Kreiran automobil");
}
}
U ovom slučaju, podrazumeva se sledeće:
public Automobil() : base()
{
}
Pozivanje konstruktora bazne klase pomoću base
Ako želimo da prosledimo vrednosti baznoj klasi, odnosno da pozovemo konstruktor bazne klase, koristi se ključna reč base.
Primer:
class Osoba
{
public string Ime;
public Osoba(string ime)
{
Ime = ime;
}
}
class Ucenik : Osoba
{
public int Razred;
public Ucenik(string ime, int razred) : base(ime)
{
Razred = razred;
}
}
Kreiranje objekta:
Ucenik u = new Ucenik("Marko", 3);
Ovde:
-
base(ime)prosleđuje vrednost konstruktoru bazne klase -
konstruktorom bazne klase se inicijalizuje polje
Ime -
konstruktorom izvedene klase se inicijalizuje polje
Razred
Obavezno pozivanje konstruktora bazne klase
Ako bazna klasa nema konstruktor bez parametara, a u izvedenoj klasi se na primer kreira objekat komoću konstruktora bez parametara, i ako se ne navede base(...), dolazi do greške pri kompajliranju ! To je zbog toga što onda kompajler posrazumevano prvo poziva konstruktor bazne klase, a tek onda konstruktor izvedene klase ...
Primer u kojem će da dođe do greške:
class A
{
public A(int x)
{
}
}
class B : A
{
public B()
{
}
}
❌ Greška: Ne postoji konstruktor bez parametara u klasi A
✔ Ispravno bi bilo:
class B : A
{
public B() : base(5)
{
}
}
Redosled izvršavanja konstruktora u hijerarhiji klasa
Ako postoji više nivoa nasleđivanja, konstruktori se pozivaju:
-
od najviše bazne klase
-
ka najnižoj izvedenoj klasi
Primer:
class A
{
public A()
{
Console.WriteLine("A");
}
}
class B : A
{
public B()
{
Console.WriteLine("B");
}
}
class C : B
{
public C()
{
Console.WriteLine("C");
}
}
Kreiranje objekta:
C obj = new C();
Izlaz:
A
B
C
Primeri za vežbu
Zadatak: Napraviti baznu klasu Zaposleni koja ima:
-
polje
Ime -
konstruktor koji prima ime
Napraviti izvedenu klasu Profesor koja ima:
-
polje
Predmet -
konstruktor koji prima ime i predmet
Rešenje:
class Zaposleni
{
public string Ime;
public Zaposleni(string ime)
{
Ime = ime;
}
}
class Profesor : Zaposleni
{
public string Predmet;
public Profesor(string ime, string predmet)
: base(ime)
{
Predmet = predmet;
}
}
Zadaci za samostalan rad
Zadatak 1: Napraviti baznu klasu Uredjaj sa poljem Proizvodjac i konstruktorom koji prima proizvođača. Zatim napraviti izvedenu klasu Telefon sa poljem Model.
<-- -->
Zadatak 2: Napraviti tri klase u hijerarhiji: Osoba, Ucenik, Maturant. U svakoj klasi ispisati poruku u konstruktoru i proveriti redosled poziva.
<-- -->
Zaključak
Konstruktori izvedenih klasa omogućavaju pravilnu inicijalizaciju objekata u hijerarhiji nasleđivanja.
-
konstruktori se ne nasleđuju, ali se uvek pozivaju
-
prvo se izvršava konstruktor bazne klase
-
ključna reč
basesluži za pozivanje konstruktora bazne klase