Professional Documents
Culture Documents
Apstraktne Klase I Interfejsi 2011 v01
Apstraktne Klase I Interfejsi 2011 v01
APSTRAKTNE KLASE
I INTERFEJSI
Apstraktne klase
Apstraktna je svaka klasa u kojoj makar jedan
metod nema telo. Dakle, ne da ima prazno telo
(a to izgleda ovako: {}), nego nema telo uopšte!
• Metod bez implementacije naziva se apstraktni metod.
• Ispred definicije apstraktne klase mora da stoji modifikator
abstract.
Od apstraktne klase ne mogu da se prave objekti.
• Apstraktne klase služe samo da bi bile nasleđivane.
• One služe kao "uzor" svojim nasleđenim klasama.
• I izvedena klasa takođe može biti apstraktna.
• Ako je i ona apstraktna, mora biti obeležena sa abstract.
• Ako nije apstraktna, onda mora imati definicije svih metoda.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 2
Primer apstraktne klase
Klasa "Rogljasto telo"
• pamtimo broj strana rogljastog tela,
• pamtimo površinu svake strane,
• konstruktor postavlja samo broj strana, ne i površine,
• napišemo metod koji postavlja površinu datoj strani,
• napišemo metod koji vraća površinu tela,
• ali...
...ne možemo da napišemo metod koji vraća
zapreminu tela, jer ne znamo kog oblika je telo.
Zato će nam on biti apstraktan.
• Za bilo koje konkretno telo imaćemo izvedenu klasu
(recimo klasu Kocka, klasu Piramida...), i svaka će imati
svoj metod za zapreminu (sa različitom formulom).
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 3
Rogljasto telo – source code
abstract public class RogljastoTelo
{
private int brojStrana;
private float[] strane;
public RogljastoTelo(int n) { // konstruktor
brojStrana = n;
strane = new float[n];
}
public setStrana( float s, int index )
{
strane[index] = s;
} Ovaj primer može se naći
public float povrsina() među urađenim primerima
{ (kao Eclipse projekat).
float p;
for ( int i = 0; i < brStrana; i++ )
p += strane[I];
return p;
}
abstract public float zapremina(); // nema vitičastih zagrada!
} // SAMO ZAGLAVLJE METODA!
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 4
Zadatak
Na programskom jeziku Java kreirati:
Apstraktnu klasu Displej koja sadrži zaštićeni podatak cifra
koja predstavlja dekadnu cifru trenutno prikazanu na displeju,
funkciju resetuj koja postavlja cifru na 0, funkciju inkrementiraj
koja povećava sadržaj displeja za 1 (po modulu 2) i apstraktni
metod stampaj koji ispisuje sadržaj displeja na standardni izlaz.
Klasu MatricniDisplej izvedenu iz klase Displej koja sadrži:
privatni podatak - matricu reda 5x3x2 – dve matrice, gde obe
simbolizuju po jednu cifru na zamišljenom displeju; "upaljeni"
segmenti displeja treba da budu predstavljeni znakom '*', a
"ugašeni" znakom '_'. Ova klasa, naravno, mora da
implementira metod stampaj, i to tako što će za svaki broj
odštampati na ekranu odgovarajuću matricu. Primeri za matrice
dati su na sledećem slajdu.
U funkciji main kreirati objekat klase MatricniDisplej, resetovati
ga i nakon toga 4 puta inkrementirati. Sadržaj displeja nakon
svake promene ispisati na standardni izlaz.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 5
Zadatk – dodatno objašnjenje
Matrice u klasi MatricniDisplej treba da liče na
nešto poput ovoga:
* * * _ _ *
* _ * _ * *
* _ * _ _ *
* _ * _ _ *
* * * _ _ *
0 1
Ideja je da zvezdice formiraju cifru na displeju.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 6
Interfejsi
Interfejs je klasa kod koje su svi metodi apstraktni.
Ona može da sadrži samo:
• apstraktne metode i
• konstante.
Interfejs ne može da sadrži atribute (promenljive).
Od interfejsa se ne mogu praviti objekti.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 9
Interfejsi
Definicija klase koja implementira interfejs:
class ime_klase implements ime_interfejsa
{
telo_klase_implementatorke
}
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 10
Interfejsi
Klasa u Javi može da imlementira više interfejsa.
• U tom slučaju, njeno ponašanje može da se shvati kao
unija skupova metoda tih interfejsa.
• PAŽNJA: to ne važi za nasleđivanje! Za razliku od jezika
C++, u Javi klasa može da ima samo jednu superklasu.
• To znači da u Javi klasa nasleđuje atribute iz samo jedne
hijerarhije, a ponašanje može da nasledi iz više različitih
hijerarhija. Ovim je delimično nadoknađen nedostatak
višestrukog nasleđivanja kod Jave.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 12
Fundamentalni zadatak
Bitni aspekti kod ovog zadatka:
1. Protumačiti šta se sve traži u zadatku. U tekstu zadatka nije rečeno
šta sve treba implementirati! Rečeno je šta sve program treba da radi, i
koje klase svakako treba da ima. Međutim, da bi program stvarno radio sve
što se traži, moraju da se implementiraju još neke stvari. Naš posao je da
uvidimo šta se podrazumeva i da to isprogramiramo. Ukoliko dobro
razumemo koncept objektnog programiranja, to nam neće biti teško.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 13
Iterator EXTENDED
Projektovati interfejs Iterator za manipulaciju kolekcijom podataka
proizvoljnih tipova, koji sadrži metode:
- 4 metoda dodajElement, za ubacivanje novog elementa u kolekciju,
- stampajTrenutni, za štampanje trenutnog elementa na ekran,
- imaJos, koji vraća informaciju o tome da li ima još elemenata,
- sledeci, za prelazak na sledeci element kolekcije,
- naPocetak, za vracanje na prvi element kolekcije.
Metod dodajElement treba da postoji u verziji za tip int, float, double i
za sve referentne tipove.
Projektovati klasu VektorIterator, koja implementira intefejs Iterator i
služi za manipulaciju kolekcijama tipa vektor (elemenata proizvoljnih
tipova). Metod stampajTrenutni treba da pretvara vrednost trenutnog
elementa u tip String i da ga potom štampa na glavni izlaz.
U metodu main testirati sve navedene metode za sve predviđene
primitivne tipove. Isprojektovati proizvoljne klase Kocka i Lopta i
testirati funkcionalnost klase VektorIterator sa njihovim objektima.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 14
Iterator EXTENDED
Ovde moramo da vodimo računa o još dve stvari.
• Prvo, moramo obezbediti nekoliko metoda za postavljanje
nove vrednosti u kolekciju (vektor) – jedan metod za
postavljanje int vrednosti, jedan metod za float vrednost
itd. Iz main metoda ćemo u kolekciju slati primitivne tipove
bez obmotavanja u wrapper klase – obmotavanje mora da
se vrši u samim metodima za postavljanje vrednosti.
• Drugo, moramo voditi računa o štampanju objekata naših
klasa. Lako je štampati objekte ugrađenih klasa (kao što je
String), ali za klase koje mi napravimo – mi moramo
isprojektovati način na koji se objekti štampaju. U ovom
slučaju najbolje je da u našim klasama (Kocka i Lopta)
predefinišemo ugrađeni metod toString, tako da on kod
njih funkcioniše (kako mi želimo). Metod stampajTrenutni
će onda moći da poziva toString za sve predviđene tipove.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 15
Kraj tematske celine 3/14
Hvala na pažnji.
Elektronski fakultet u Nišu - Katedra za računarstvo - Mr Martin Jovanović - Programski jezici 2011 Slajd 16