Professional Documents
Culture Documents
Prednáška 3 - Polymorfizmus, Rozhranie (Pokračovanie)
Prednáška 3 - Polymorfizmus, Rozhranie (Pokračovanie)
Testovanie programu
Testami riadený vývoj softvéru (Test-driven development - TDD)
Refaktoring kódu
Polymorfizmus
Rozhranie (Interface)
Trieda implementujúca rozhranie
Polymorfizmus: rôzne objekty (objekty rôznych tried) môžu prijať tú istú správu a
pritom každý z nich reaguje na prijatú správu inak (vykonáva inú metódu)
Rozhranie (interface)
- rozhranie (v širšom slova zmysle) špecifikuje interakciu objektu so svojím
okolím
- je tvorené zoznamom správ, ktoré je schopné objekt prijať a reagovať na ne
(vykonaním zodpovedajúcej metódy)
- rozhranie v užšom slova zmysle v jazyku Java (interface) predstavuje
referenčný typ (podobne ako trieda)
- rozhranie definuje množinu metód ale neimplementuje ich
Definícia rozhrania
Príklad:
public interface Zobrazitelny
{
void zobraz(int kolkokrat);
}
// ostatne metody
}
// ostatne metody
}
Zabezpečenie polymorfizmu
- deklarovaná premenná je typu rozhranie - jej statický typ je typu rozhranie
- pri kompilácii programu je známy iba statický typ premennej
- premenná typu rozhranie je typovo kompatibilná (vzhľadom na priradenie) s
objektami všetkých tried, ktoré rozhranie implementujú premennej typu
rozhranie možno priradiť referenciu na objekt ľubovoľnej triedy, ktorá
implemetuje rozhranie
- dynamický typ premennej zodpovedá typu objektu, referenciu na ktorý
premenná aktuálne obsahuje
- dynamický typ premennej sa určuje počas behu programu
- statický aj dynamický typ premennej možno pomocou operátora
instanceof
Výraz Hodnota
p1 instanceof Zobrazitelny true
p1 instanceof Text true
p1 instanceof Obrazok false
p1.getClass().getName() “Text”
p2 instanceof Zobrazitelny true
p2 instanceof Text false
p2 instanceof Obrazok true
p2.getClass().getName() “Obrazok”
System.out.println("\fOBJEDNAVKA");
System.out.println(zoznam);
System.out.printf("%30s %6.2f m2 (%5.2f EUR/m2)\n",
"Celkova spotreba materialu =",spotreba,
Objednavka.CENA_MATERIALU);
System.out.printf("%30s %6.2f m (%5.2f EUR/m)\n",
"Celkova dlzka rezu =", rez,
Objednavka.CENA_REZANIA);
System.out.printf("%30s %6.2f EUR \n",
"Cena za material =",cenaMaterial);
System.out.printf("%30s %6.2f EUR \n",
"Cena za rezanie materialu =", cenaRez);
System.out.printf("%30s %6.2f EUR \n",
"Celkova cena objednavky =",
cenaMaterial + cenaRez);
}
}
Výstup programu:
OBJEDNAVKA
Zoznam dielcov
1. Kruh (r= 0.20)
2. Kruh (r= 0.20)
3. Obdlznik (a= 2.00, b= 1.26)
4. Stvorec (a= 0.50)
5. Obdlznik (a= 1.00, b= 2.00)
Dedičnosť
Situácia:
1. Objekty triedy T1 majú podobné vlastnosti (atribúty, metódy) ako objekty
triedy T2. Pri deklarácii tried by sa v oboch triedach opakovali časti kódu v
nezmenenom tvare (Študent, Učiteľ – vlastnosti: meno, priezvisko,
dátum narodenia ).
2. Deklarované triedy majú známky hierarchického vzťahu medzi sebou
navzájom – objekty triedy S možno súčasne považovať aj za špecifický
prípad objektov typu T (Šofér Zamestnanec, Termínovaný účet
Bankový účet, Osobný automobil Automobil, …)
Let q(x) be a property provable about objects x of type T. Then q(y) should be true for
objects y of type S where S is a subtype of T.
Nech q(x) je vlastnosť dokázateľná (platiaca) pre objekty x typu T. Potom q(y) musí byť
splnená (pravdivá) pre objekty y typu S, kde S je subtyp (potomok) typu T.
(http://en.wikipedia.org/wiki/Liskov_substitution_principle):
LSP je zároveň definíciou princípu zastupiteľnosti (substitutability) objektov (objektových
premenných):
Dedičnosť:
- možnosť deklarovať triedy, ktoré sú v hierarchickom vzťahu predok potomok
o predok – nadtyp, supertyp, priamy predok, absolútny predok, …
o potomok – podtyp, subtyp, priamy potomok, absolútny potomok, …
- potomok dedí od svojho predka (v závislosti od modifikátora dostupnosti)
o vnútorný pohľad
atribúty
metódy
o vonkajší pohľad – verejné rozhranie (správy)
- !!! potomok nededí konštruktory
Deklarácia triedy
[....] class Trieda extends TriedaPredka [implements Rozhr1 [,...]]
{
[ // deklarácia atribútov ]
[ // deklarácia konštruktorov ]
// deklarácia metód
}
- Potomok Trieda zdedí od predka TriedaPredka všetky atribúty, dostupné v nej budú
však iba atribúty public a protected
- V triede potomka možno deklarovať ďalšie nové atribúty
- Trieda potomka zdedí od triedy predka všetky metódy, ktoré sú public alebo
protected. Trieda môže tieto metódy
o ignorovať – metódy vôbec nie sú využívané
o využívať bez zmeny
o predefinovať (prekryť) – definovať novú funkcionalitu metódy, rozhranie metódy sa
nemení (trieda má rovnakú hlavičku)
- navyše môžu byť v triede potomka definované nové metódy
- Potomok nededí konštruktor (konštruktory) predka
o Potomok musí mať definovaný vlastný konštruktor (konštruktory)
o Každý konštruktor potomka musí mať vo svojom tele ako prvý príkaz príkaz pre
vyvolanie konštruktora predka v tvare
super(zoznam_skutočných_parametrov_konštruktora);
Dostupnosť v
Modifikátor triede balíčku u potomka všade
public Áno Áno Áno Áno
protected Áno Áno Áno Nie
--- (friendly) Áno Áno Nie Nie
private Áno Nie Nie Nie
Príklad:
{
private int pocOsob;
return kapacita;
}
System.out.print("\f");
System.out.println("Firma *** kovaTrans s.r.o. ***");
System.out.println("Firma vlastni "+
kovaTrans.pocetVozidiel()+" vozidiel");
System.out.println("Prepravna kapacita firmy: "
+kovaTrans.prepravnaKapacita()+" osob");
System.out.println("Dopravna kapacita firmy: "
+kovaTrans.dopravnaKapacita()+" kg nakladu");
}
}
Výstup programu: