Klasa može biti deklarisana kao apstraktna dodavanjem ključne reči abstract pre definicije klase. Apstraktna klasa ne može da ima instance. Njena svrha je da obezbedi zajedničku definiciju osnovne klase koju više izvedenih klasa mogu da dele.

Apstraktne klase mogu da definišu i apstraktne metode. Ovo se postiže dodavanjem ključne reči abstract pre povratnog tipa metode. Apstraktne metode nemaju implementaciju, pa se metoda završava znakom ;. Izvedene klase koje nasleđuju tu klasu moraju da implementiraju sve apstraktne metode.

Primer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class Osnovna
{
    protected int x = 100;
    protected int y = 150;
    public abstract void Uvecaj(); // Apstraktna metoda
}
 
class Izvedena : Osnovna
{
    public override void Uvecaj()
    {
        x++;
        y++;
    }
}

Ako virtuelnu metodu proglasimo za apstraktnu, ona ostaje virtuelna za svaku klasu koja je nasledila tu apstraktnu klasu.

Primer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 class D
{
    public virtual void Uradi(int i)
    {
        // Originalna implementacija
    }   
}
 
abstract class E : D
{
    public abstract override void Uradi(int i);
}
 
class F : E
{
    public override void Uradi(int i)
    {
        // Nova implementacija
    }
}


************Objašnjenje sa malo jasnijim primerom: *****************

Posmatrajmo klasu Figura. Ova klasa ima atribut ime i metodu Povrsina:

abstract public class Figura
{
public string ime;

public void postaviIme(string ime)
{
this.ime = ime;
}

abstract public float Povrsina();
}

Iz ove klase je moguće izvesti dve nove klase DvodimenzioneFigure i TrodimenzioneFigure, koje predstavljaju figure u ravni, odnosno u prostoru. Njihov položaj u ravni odnosno u prostoru je određen koordinatama gornjeg levog temena. Gornje levo teme ima svoje koordinate predstavljene atributima X_Koordinata, Y_Koordinata i Z_Koordinata.

Iz klase DvodimenzioneFigure izvešćemo klasu Pravougaonik, a iz klase TrodimenzioneFigure izvešćemo klasu Kvadar. Pravougaonik je određen svojom dužinom i širinom a kvadar ima i visinu. Za figure u prostoru pored površine moguće je izračunati i zapreminu pa će kao dodatak biti metoda float Zapremina().

abstract public class Figura
{ public string ime;
public void postaviIme(string ime)
{
this.ime = ime;
}

abstract public float Povrsina();
}

abstract public class DvodimenzionaFigura : Figura
{
float X_Koordinata;
float Y_Koordinata;

public DvodimenzionaFigura(float X, float Y)
{
X_Koordinata = X;
Y_Koordinata = Y;
}
}

abstract public class TrodimenzionaFigura : Figura
{
float X_Koordinata;
float Y_Koordinata;
float Z_Koordinata;

public TrodimenzionaFigura(float X, float Y, float Z)
{
X_Koordinata = X;
Y_Koordinata = Y;
Z_Koordinata = Z;
}

abstract public float Zapremina();
}

public class Pravougaonik : DvodimenzionaFigura
{
float duzina;
float sirina;

public Pravougaonik( float X_koo, float Y_koo, float duz, float sir) : base(X_koo, Y_koo)
{
duzina = duz;
sirina = sir;
}

public override float Povrsina()
{
return duzina * sirina;
}
}

public class Kvadar : TrodimenzionaFigura
{
float duzina;
float sirina;
float visina;

public Kvadar(float X_koo, float Y_koo, float Z_koo, float duz, float sir, float vis): base(X_koo, Y_koo, Z_koo)
{
duzina = duz;
sirina = sir;
visina = vis;
}

public override float Povrsina()
{
return 2*(duzina * sirina + duzina * visina + sirina * visina);
}
public override float Zapremina()
{
return duzina * sirina * visina;
}
}


Instanciranjem neke klase dobijaju se konkretni objekti koji imaju konkretne osobine.

Posmatrajmo klasu Figura. Šta bi bila instanca ove klase tj. kakav bi to bio objekat? Očigledno je da je teško zamisliti takav objekat jer ga ne možemo tačno okarakterisati. Nasuprot tome, ako kažemo da je neki objekat instanca klase Pravougaonik imamo tačnu predstavu o tom objektu tj gde se nalazi u ravni i koje su mu dimenzije.

Može se zaključiti da neke klase nisu pogodne da bi kreirali instance tih klasa ali su zato pogodne za izvođenje novih klasa.

Takav je slučaj sa klasom Figura. Ovakve klase se nazivaju apstraktnim klasama.

Da je neka klasa apstraktna oznaćava se slućbenom rečju abstract na početku deklaracije klase kao što je to slučaj sa klasom Figura ali isto tako i sa klasama DvodimenzionaFigura i TrodimenzionaFigura.

Apstraktne klase mogu imati apstraktne metode koje isto tako imaju ključnu reč abstract u deklaraciji. Ove metode nemaju telo i one se definiču u izvedenim klasama.

Znači:

apstraktne klase nemaju svoje instance tj objekte, koriste se za izvođenje drugih klasa, konstruktor apstraktne klase ne može biti apstraktan i apstraktne metode iz osnovne klase moraju se pregaziti metodama u izvedenim klasama.

Last modified: Monday, 1 February 2021, 8:56 AM