Objektno-orjentisano programiranje

Vežbe 5

Apstraktne klase

Pogledajte postavku zadatka sa prethodnog termina. U postavci zadatka piše da metoda dajPovrsinu() u klasi GeometrijskiOblik vraća 0. Klase koje nasleđuju ovu klasu posle prepisuju ovu metodu tako da vraćaju površinu za neki konkretan oblik. Znamo kako se računa površina pravougaonika, trougla, … tj. njihove formule za površinu.

Koja je formula za računanje površine za klasu GeometrijskiOblik? Ona ne postoji.

U objektnim jezicima je moguće metode ostaviti i bez implementacije. Takvi metodi se nazivaju apstraktnim i u Javi se deklarišu na sledeći način:

abstract void metod_name(arguments);

Apstraktni metodi nemaju implementaciju, tj. definisano telo. Imaju samo potpis.

Klase u kojima postoje metodi koji su apstraktni se nazivaju apstraktnim klasama i pri njihovom deklarisanju je neophodno, kao i kod metoda, potrebno apstraktnost naglasiti.

abstract class GeometrijskiOblik {
    abstract double dajPovrsinu();
}

Apstraktna klasa se ne može instancirati, već se može koristiti samo za referenciranje objekata koji su instance izvedenih klasa. Klase koje se mogu instancirati se nazivaju konkretnim.

Osobine apstraktnih klasa:

Interfejsi

Interfejs je “ugovor” kojim se klasa obavezuje da će implementirati metode definisane u interfejsu. U Javi interfejs je referentni tip (kao i klasa).

interface Interfejs {
  ...
}

Osobine interfejsa:

interface IDeljivo {
  boolean jeDeljivo(int n, int k); // <=> public abstract boolean jeDeljivo(int n, int k);
}
interface GeometrijskaFigura {
  double PI = 3.14; // <=> public static final double PI = 3.14;
  double dajPovrsinu(); // <=> public abstract double dajPovrsinu();
}
interface IDeljivo {
  boolean jeDeljivo(int n, int k); // <=> public abstract boolean jeDeljivo(int n, int k);
}

class Test {
  public static void main(String[] args) {
    IDeljivo d = new IDeljivo(); // NIJE MOGUCE
  }
}

Klase implementiraju interfejse. Nakon navođenja imena neke podklase i eventualnog definisanja da je izvedena iz neke nadklase, mogu se opciono implemetirati (implements) jedan ili više interfejsa (simulacija višestrukog nasleđivanja).

class NekaKlasa extends Object implements IDeljivo, GeometrijskaFigura, ... {

}

/// ili

class NekaKlasa implements IDeljivo, GeometrijskaFigura, ... {

}