objektno orijentisano programiranje - · pdf fileobjektno orijentisano programiranje...
TRANSCRIPT
OBJEKTNO ORIJENTISANO PROGRAMIRANJE
PREDAVANJE 11: NASLEĐIVANJE
Miloš Kovačević
Đorđe Nedeljković
1 /17
OSNOVNI KONCEPTI
- Nasleđivanje
- Podtipovi i substitucija
- Polimorfne varijable
- Klasna hijerarhija i klasa Object
2 /17
DEMO – DoME PRIMER- Treba napraviti bazu multimedijalnih sadržaja za iznajmljivanje
(muzički cd, video dvd, ...)
3 /17
polja
metode
DEMO – DoME PRIMER
4 /17
DoME – ANALIZA IZVORNOG KODA- Otvoriti projekat dome-v1 iz chapter08
- Klase CD i Video su veoma slične (imaju slično ponašanje i osobine)
- U rešenju v1 postoji značajno ponavljanje koda u CD i Video klasama
- Prilikom održavanja koda promene se moraju dvaput sprovesti - potencijalni izvor grešaka
- Ponavljanje koda u Database klasi – odvojena polja za CD i Video diskove, ponavljanje logike za ubacivanje multimedijalnog sadržaja, ponavljanje funkcionalnosti štampe u metodi list()
- Šta bi se desilo kada bi u sistem ubacili audio knjigu?
- Problemi koji nastaju prilikom rada sa klasama čiji se značajan deo osobina i ponašanja preklapa rešavaju se primenom koncepta nasleđivanja
5 /17
- Nasleđivanje omogućava definisanje klase iz već postojeće srodne klase
- Klasa Item je superklasa za CD i Video klase
- Klase CD i Video su potklase klase Item
- Kaže se da su CD i Video izvedene iz klase Item
- Potklasa pored svojih, nasleđuje sve osobine i ponašanja superklase
- Izvođenjem se definiše „JE“ relacija CD JE Item, Video JE Item
NASLEĐIVANJE
6 /17
- Otvoriti dome-v2 iz chapter08
DoME V2 – VERZIJA SA NASLEĐIVANJEM
7 /17
public class Item{
private String title;
private int playingTime;
private boolean gotIt;
private String comment;
// ...
}
public class CD extends Item{
private String artist;
private int numberOfTracks;
// ...
}
public class Video extends Item{
private String director;
// ...
}
NASLEĐIVANJE I INICIJALIZACIJA
8 /17
public class Item{
private String title;
private int playingTime;
private boolean gotIt;
private String comment;
public Item(String theTitle, int time){
title = theTitle;
playingTime = time;
gotIt = false;
comment = "";
} //...
public class CD extends Item{
private String artist;
private int numberOfTracks;
public CD(String theTitle, String theArtist, int tracks, int time){
super(theTitle, time);
artist = theArtist;
numberOfTracks = tracks;
} //...
super – poziv konstruktora super klase
- Ključna reč super poziva konstruktor superklase
- Mora biti na početku konstruktora izvedene klase
- Ako se izostavi, Java kompajler automatski ubacuje poziv super(), u ovom slučaju superklasa mora da ima definisan konstruktor bez parametara
INICIJALIZACIJA - SUPER
9 /17
- Objekat potklase vidi sva javna polja i metode superklase kao svoja (ne koristi se notacija sa tačkom)
- Privatna polja i metode iz superklase ostaju nevidljiva za potklasu
PRISTUPANJE METODAMA I POLJIMA SUPERKLASE IZ OBJEKTA POTKLASE
10/17
public class GeometrijskaSlika{
private String ime;
public Tacka teziste;
public GeometrijskaSlika(Tacka t, String i){
teziste = t; ime = i;
}
public GeometrijskaSlika(){ teziste = new Tacka(0,0); ime = ""; }
public String dajIme(){ return ime; }
}
public class Krug extends GeometrijskaSlika{
private double r;
public Krug(){ r = 1; } // pravi jedinicni krug u 0,0
// implicitni poziv GeometrijskaSlika()
public Krug(Tacka c, double r){ super(c, ""); this.r = r; }
public Tacka dajCentar(){ return teziste; }
public void info(){
System.out.println("Krug " + dajIme() + " r=" + r);
}
}
- Nad objektom potklase može se pristupiti svim javnim poljima i metodama superklase (u notaciji sa tačkom )
- Privatna polja i metode superklase ostaju nevidljiva
PRISTUPANJE METODAMA I POLJIMA SUPERKLASENAD OBJEKTOM POTKLASE
11/17
public class GeometrijskaSlika{
private String ime;
public Tacka teziste;
// ...
public String dajIme(){ return ime; }
}
public class Krug extends GeometrijskaSlika{
//...
}
Krug k = new Krug();
String ime = k.dajIme();
Tacka t = k.teziste;
- Od ranije poznato: klase predstavljaju složene (objektne) tipove podataka
- Za potklasu se kaže da je podtip od tipa superklase
- Objektna promenljiva može da ukazuje na objekte svoje klase (poznato od ranije) ili na objekte izvedenih klasa
- Primer:
PODTIPOVI I DODELA VREDNOSTI
12/17
Item prvi = new Item(...);
Item drugi = new CD(...);
Item treci = new Video(...);
// CD – podtip tipa Item
// Video – podtip tipa Item
// sledece ne moze!
CD cetvrti = new Item(...);
- Promenljiva podtipa može biti na svim mestima gde se očekuje promenljiva tipa
SUBSTITUCIJA TIPA PODTIPOM
13/17
public class Database{
private ArrayList<Item> items;
public Database(){
items = new ArrayList<Item>();
}
public void addItem(Item theItem){
items.add(theItem);
}
//...
} Database db = new Database();
CD c = new CD(...);
Video v = new Video(...);
db.addItem(c);
db.addItem(v);substitucija Item sa CD i Video
- Polimorfizam – mogućnost poprimanja više oblika
- Objektne promenljive u Javi su polimorfne – pokazuju na objekte deklarisane klase ili na izvedene klase
- Primer:
POLIMORFNE VARIJABLE
14/17
public class Database{
private ArrayList<Item> items;
//...
public void list(){
for(Item item : items) {
item.print();
System.out.println();
}
}
} polimorfna varijabla
- Klasa u isto vreme može biti i izvedena i superklasa
- Klasa može da ima samo jednu superklasu (ograničenje u Javi)
- Primer: proširenje DoME na druge tipove multimedije
- Klasa nasleđuje svojstva i ponašanja od svih klasa iznad sebe u klasnoj hijerarhiji
KLASNE HIJERARHIJE
15/17
- Izbegavanje ponavljanja koda
- Ponovno iskorišćenje koda
- Jednostavnije održavanje
- Jednostavnije proširivanje postojećih sistema
PREDNOSTI NASLEĐIVANJA
16/17
- Sve do sada korišćene klase (do ovog predavanja) u svojoj definiciji nisu sadržavale ključnu reč extends – kao da nije bilo nasleđivanja
- Međutim, sve klase u Javi za koje je izostavljen extendsizvedene su iz klase Object
- Java kompajler automatski dodaje extends Object ukoliko extends fali
- Klase koje su izvedene iz neke druge klase na vrhu klasne hijerarhije imaju klasu Object
- Najčešće korišćene metode nasleđene iz klase Objectsu toString(), equals(), i hashcode() (sledeće predavanje)
KLASA OBJECT
17/17