U dosadašnjem radu sa klasama i nasleđivanjem, svaka klasa je mogla da se iskoristi za pravljenje objekata. Međutim, u praksi se često javlja potreba da se definiše opšta klasa, koja služi kao osnova za druge klase, ali nema smisla da se od nje direktno prave objekti.

Na primer, pojam Vozilo je previše opšti da bi se napravio konkretan objekat. Ne postoji „neko vozilo“ — postoji automobil, autobus, bicikl. U takvim situacijama koristi se apstraktna klasa.

Apstraktna klasa omogućava:

  • definisanje zajedničkih osobina i ponašanja,
  • nametanje obaveze izvedenim klasama da implementiraju određene metode,
  • sprečavanje pravljenja objekata bazne klase.

Pojam apstraktne klase

Apstraktna klasa je klasa koja je označena ključnom rečju abstract i :

  • ne može se instancirati (ne mogu se praviti objekti),
  • može sadržati polja i svojstva, obične (konkretne) metode, apstraktne metode (bez tela), konstruktore i služi kao osnova za izvedene klase

Primer apstraktne klase:

abstract class Vozilo
{
    public int Brzina;
}

❌ Sledeće NIJE dozvoljeno:

Vozilo v = new Vozilo(); // greška

✔ Dozvoljeno je samo nasleđivanje:

class Automobil : Vozilo
{
}

Apstraktne metode

Apstraktna metoda je metoda koja :

  • nema telo metode,
  • definiše se samo njen potpis,
  • mora biti implementirana u svakoj neapstraktnoj izvedenoj klasi.

Primer:

abstract class Vozilo
{
    public abstract void Pokreni();
}

Izvedena klasa:

class Automobil : Vozilo
{
    public override void Pokreni()
    {
        Console.WriteLine("Automobil je pokrenut.");
    }
}

📌 Ključne reči:

  • abstract → metoda bez implementacije

  • override → obavezna implementacija u izvedenoj klasi


Kombinacija apstraktnih i konkretnih metoda

Apstraktna klasa ne mora imati samo apstraktne metode, već može da sadrži i metode koje su već implementirane.

Primer:

abstract class Zaposleni
{
    public string Ime;

    public void PrijavaNaPosao()
    {
        Console.WriteLine("Zaposleni je prijavljen.");
    }

    public abstract double IzracunajPlatu();
}

Izvedena klasa:

class Profesor : Zaposleni
{
    public override double IzracunajPlatu()
    {
        return 80000;
    }
}

👉 Svi zaposleni se prijavljuju isto, ali se plata računa različito.


Apstraktna klasa i konstruktori

Iako se od apstraktne klase ne mogu praviti objekti, ona može imati konstruktor. Taj konstruktor se poziva prilikom kreiranja objekta izvedene klase.

Primer:

abstract class Osoba
{
    public string Ime;

    public Osoba(string ime)
    {
        Ime = ime;
    }
}

class Ucenik : Osoba
{
    public Ucenik(string ime) : base(ime)
    {
    }
}

📌 Iako se ne mogu praviti objekti klase Osoba, njen konstruktor se ipak izvršava.


Apstraktna klasa i nasleđivanje

  • apstraktna klasa može nasleđivati drugu apstraktnu klasu,
  • apstraktna klasa ne mora implementirati apstraktne metode bazne klase,
  • prva konkretna klasa u hijerarhiji mora implementirati sve apstraktne metode.

Primer:

abstract class A
{
    public abstract void Metoda();
}

abstract class B : A
{
}

class C : B
{
    public override void Metoda()
    {
        Console.WriteLine("Implementacija");
    }
}


Dodatak: sealed klasa (zatvaranje hijerarhije)

Nakon apstraktne klase, prirodno se postavlja pitanje:  „Da li svaka klasa mora da se nasleđuje?“  Odgovor je — ne.

Pojam sealed klase

Sealed klasa je klasa označena ključnom rečju sealed i ona ne može imati izvedene klase,

Primer:

sealed class Konfiguracija
{
    public string Verzija = "1.0";
}

Pokušaj nasleđivanja:

class NaprednaKonfiguracija : Konfiguracija
{
}

❌ Greška pri kompajliranju.


Odnos apstraktne i sealed klase

  • Apstraktna klasa
    • ne može se instancirati (ne može imati objekte)
    • mora se nasleđivati
  • Sealed klasa
    • može se instancirati (može imati objekte)
    • ne može se nasleđivati

Primer za demonstraciju (apstraktna + sealed)

abstract class Oblik
{
    public abstract double Povrsina();
}

class Pravougaonik : Oblik
{
    public override double Povrsina()
    {
        return 20;
    }
}

sealed class Kvadrat : Pravougaonik
{
}

👉 Kvadrat je poslednja dozvoljena izvedena klasa.


(nastavak koji je ostavljen za 13.02 - uz lekcije iz polimorfizma)

Primer koji ćemo da radimo na sledećem času:

Zadatak: Napraviti apstraktnu klasu Oblik sa apstraktnom metodom Povrsina(). Nakon toga napraviti izvedene klase Pravougaonik i Krug. Na kraju napraviti izvedenu klasu Kvadrat koja treba da je sealed

Rešenje:

abstract class Oblik
{
    public abstract double Povrsina();
}

class Pravougaonik : Oblik
{
    public double A, B;

    public Pravougaonik(double a, double b)
    {
        A = a;
        B = b;
    }

    public override double Povrsina()
    {
        return A * B;
    }
}

class Krug : Oblik
{
    public double R;

    public Krug(double r)
    {
        R = r;
    }

    public override double Povrsina()
    {
        return 3.14 * R * R;
    }
} 

sealed class Kvadrat : Pravougaonik
{
// Šta ide ovde ?
}

Zadaci za vežbu

Zadatak 1: Napraviti apstraktnu klasu Zivotinja sa apstraktnom metodom OglasiSe(). Nakon toga napraviti izvedene klase Pas i Macka.

<-- -->


Zadatak 2:  Napraviti apstraktnu klasu Radnik sa apstraktnom metodom IzracunajPlatu(). Nakon toga napraviti izvedene klase RadnikNaSat i StalniRadnik.

<-- -->


Zadatak 3: Napraviti klasu Racun koja je izvedena iz apstraktne klase Dokument, a zatim je označiti kao sealed.

<-- -->


...

Last modified: Friday, 6 February 2026, 6:04 PM