Polimorfizam i redefinisanje metoda

Polimorfizam i redefinisanje metoda

Redefinisanje metoda omogućava polimorfizam u trenutku izvršavanja. Polimorfizam omogućava da opšta klasa definiše metode koje će biti zajedničke za sve klase koje su iz nje izvedene, ostavljajući potklasama slobodu da definišu specifične varijante nekih ili svih pomenutih metoda. Posmatrajmo sledeće tri klase:

class Instrument {

abstract void sviraj();

}

class Violina extends Instrument {

void sviraj() {…}

}

class Klarinet extends Instrument {

void sviraj () {…}

}

Class Muzicar {

void sviraj (Instrument i) {

i . sviraj ();

}

}

Kada metoda potklase ima isto ime i tip kao neka metoda natklase, tada metoda potklase ima prednost nad metodom natklase, ona je redefiniše (engl. override). Kada se unutar potklase pozove tako redefinisana metoda, uvek će se izvršiti njena verzija koja je definisana u potklasi. Verzija metode koja je definisana u natklasi će biti skrivena.

Dakle, prethodni primer definiše tri klase: klasa Instrument je apstraktna klasa (njena metoda sviraj je apstraktna), a klase Violina i Klarinet nasleđuju klasu Instrument i, naravno, implementiraju (redefinišu) apstraktnu metodu. Posmatrajmo sada klasu Muzicar:

Class Muzicar {

void sviraj (Instrument i) {

i . sviraj ();

}

}

Vidimo da klasa Muzičar ima metodu sviraj, koja kao parametar ima instancu klase Instrument; sa druge strane, znamo da klasa Instrument ne može imati instance jer je apstraktna.

Metoda sviraj će ipak biti upotrebljiva, jer se njoj kao parametar može proslediti instanca neke klase koja nasleđuje klasu Instrument, u ovom slučaju – instance klasa Violina i Klarinet. Iskaz:

Muzicar m = new Muzicar();

m.sviraj (new Klarinet());

izazvaće pozivanje metode sviraj klase Klarinet (iako se to nigde eksplicitno ne navodi u metodi sviraj klase Muzicar). Iskaz:

m. sviraj (new Violina());

izazvaće pozivanje metode sviraj klase Violina po istom principu. Dakle, poziv metode sviraj klase Muzicar će imati različite efekte zavisno od toga koji objekat prosledimo kao parametar. Određivanje koja metoda će se pozvati obavlja se u toku izvršavanja programa.

Pogledajmo sledeći primer:

class A {

int i, j;

A(int a, int b) {

i = a;

j = b;

}

void show() {

System.out.println(„i and j: “ + i + “ “ + j);

}

}

class B extends A {

int k;

B(int a, int b, int c) {

super(a, b);

k = c;

}

// Prikazuje k – ovim se redefinise metoda show() u A

void show() {

System.out.println(„k: “ + k);

}

}

class Override {

public static void main(String args[]) {

B subOb = new B(1, 2, 3);

subOb.show(); // poziva metodu show() u B

}

}

Rezultat programa će biti:

k: 3.

Ukoliko se želi izbeći redefinisanje metoda, tada se koristi rezervisana reč final. Već je bilo reči da final služi za pravljenje konstanti, međutim, ona se odnosi i na nasleđivanje. Da bi onemogućili redefinisanje određene metode, na početak njene deklaracije se stavlja modifikator final. Metode koje su označene kao final se ne mogu redefinisati. Ukoliko se želi sprečiti i nasleđivanje određene klase, to se takođe može postići stavljanjem rezervisane reči final ispred deklaracije te klase.

1 thoughts on “Polimorfizam i redefinisanje metoda

Постави коментар