Polymorfizmus-balíčky
Šestnásta prednáška
Stiahnuť PDF · 4,5 MBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Polymorfizmus III
Informatika 2
Pojmy zavedené v 4. prednáške
• význam interface pre polymorfizmus
– statický typ
• testovanie tried pre priamu komunikáciu s
hráčom
– polymorfizmus terminálu – interface
• pretypovanie
Informatika 2
1
Cieľ prednášky
• interface
– implementácia viac interface v jednej triede
– rozširovanie jedného interface v inom interface
• pretypovanie – pokračovanie
• balíčky – štruktúra knižníc
• príklad: World of FRI
Informatika 2
2
Pretypovanie
• zmena statického typu
• zmena množiny správ, ktoré je možné poslať
• implicitné
• explicitné
Informatika 2
3
Implicitné pretypovanie
• automatické pretypovanie
• iba obmedzenie množiny správ
• vykonáva a kontroluje prekladač pri preklade
• statický typ musí byť typovo kompatibilný s
cieľovým typom
• literál null sa dá implicitne pretypovať na
ľubovoľný objektový typ
Informatika 2
4
IPredmet predmet = new Walkman();
Explicitné pretypovanie
• pretypovanie „na požiadanie“
• rozšírenie, alebo výmena množiny správ
• prekladač robí iba čiastočnú kontrolu
• vykonáva a kontroluje JVM za behu programu
• dynamický typ musí byť typovo kompatibilný s
cieľovým typom
• hodnota null sa dá explicitne pretypovať na
ľubovoľný objektový typ
Informatika 2
5
Explicitné pretypovanie – príklad
• nový typ do zátvorky pred výraz, ktorý má byť
pretypovaný
Informatika 2
6
Walkman predmet =
(Walkman)paHrac.dajPredmet("walkman");
7
Informatika 2
Pretypovanie(1)
Implicitné
I
Explicitné
E
Pretypovanie(2)
IPredmet predmet;
Walkmen walkmen = new Walkmen();
predmet = walkmen; // OK
walkmen = predmet; // Chyba
walkmen = (Walkmen) predmet; // OK
Informatika 2
8
9
Informatika 2
Pretypovanie(3)
I
E
I
E
Pretypovanie(4)
IVozidlo vozidlo;
Auto auto = new Auto();
Bicykel kolo = new Bicykel();
vozidlo = auto; // OK
auto = kolo; // Chyba
auto = (Auto) kolo; // Chyba
auto = (Auto) vozidlo; // OK
kolo = (Bicykel) vozidlo; // Chyba za behu
Informatika 2
10
11
Informatika 2
Pretypovanie(5)
I
E
I
E
E
E
Pretypovanie(6)
IPlavidlo cln;
IBudova dom;
ObytnyCln korzar = new ObytnyCln();
cln = korzar; // OK
dom = cln; // Chyba
dom = (IBudova) cln; // OK
Informatika 2
12
„World of FRI“ – úloha 1
• nový prvok hry – vrecková čierna diera
– hráč ju môže zobrať do inventára
– hráč ju môže položiť do miestnosti
– hráč môže vojsť do čiernej diery
Informatika 2
13
Vrecková čierna diera
• je to miestnosť – da sa do nej vojsť?
• je to predmet – dá sa zdvihnúť, položiť?
• oboje je možné
Informatika 2
14
Riešenie
• čierna diera je
– predmet – implementácia interface IPredmet
– miestnosť – implementácia interface ?
• interface pre miestnosti
Informatika 2
15
Súčasný stav
Informatika 2
16
Interface IMiestnost
Informatika 2
17
Interface IMiestnost
public interface IMiestnost
{
IMiestnost dajVychod(String paSmer);
String dajUplnyPopis();
IPredmet zoberPredmet(String paNazov);
void polozPredmet(IPredmet paPredmet);
}
Informatika 2
18
Dôsledky zavedenia IMiestnost
• trieda Hrac
– aktuálna miestnosť je typu IMiestnost
• trieda Miestnost
– východy sú typu IMiestnost
• trieda MapaHry
– východzia miestnosť je typu IMiestnost
Informatika 2
19
Vrecková čierna diera
Informatika 2
20
Implementácia viac interface
• trieda môže implementovať ľubovoľný počet
interface (0...n)
• kľúčové slovo implements len jeden krát
• oddeľovač – čiarka
Informatika 2
21
public class VreckovaCiernaDiera
implements IPredmet, IMiestnost
Trieda CiernaDiera(1)
public class CiernaDiera
implements IPredmet, IMiestnost
{
private String aNazov;
public CiernaDiera(String paNazov)
{
aNazov = paNazov;
}
...
}
Informatika 2
22
Trieda CiernaDiera(2)
public IMiestnost dajVychod(String paSmer)
{
return null;
}
public String dajUplnyPopis()
{
return "Cierna diera. Rutis sa rychlostou svetla
ku horizontu udalosti.";
}
Informatika 2
23
Trieda CiernaDiera(3)
public IPredmet zoberPredmet(String paNazov)
{
return null;
}
public void polozPredmet(IPredmet paPredmet)
{
System.out.println("Flunk... Cierna diera zhltla
predmet " + paPredmet.dajNazov());
}
Informatika 2
24
Trieda CiernaDiera(4)
public String dajNazov()
{
return aNazov;
}
public String dajPopis()
{
return "Nieco cierne... derave... waaa, cierna diera";
}
public String pouzi(Hrac paHrac)
{
return "Ako by si ju asi tak chcel pouzit?";
}
Informatika 2
25
Priebeh hry
Informatika 2
26
Výsledok implementácie IMiestnost
• čierna diera môže byť používaná aj ako predmet
aj ako miestnosť
– do čiernej diery sa však nedá vojsť
– trieda Miestnost nevie, že predmet typu CiernaDiera
je tiež východ
– treba zmeniť implementáciu dajVychod
Informatika 2
27
dajVychod v triede Miestnost
• stará implementácia
• vráti východ daným smerom
• ak neexistuje, vráti null
Informatika 2
28
public IMiestnost dajVychod(String paSmer)
{
return aVychody.get(paSmer);
}
Nová implementácia dajVychod(1)
• zistí, či existuje predmet s daným názvom
• ak áno:
– zistí, či predmet implementuje IMiestnost
– ak áno, pretypuje ho na IMiestnost a vráti
– ak nie, vráti null
• ak nie:
– vráti východ daným smerom
– ak neexistuje, vráti null
Informatika 2
29
Nová implementácia dajVychod(2)
public IMiestnost dajVychod(String paSmer)
{
if (aPredmety.containsKey(paSmer)) {
IPredmet predmet = aPredmety.get(paSmer);
return (IMiestnost)predmet;
}
return aVychody.get(paSmer);
}
Informatika 2
30
Priebeh hry
Informatika 2
31
Vojdenie do kameňa
Informatika 2
32
java.lang.ClassCastException:
fri.worldOfFri.predmety.Predmet cannot be
cast to fri.worldOfFri.mapaHry.IMiestnost
Oprava implementácie dajVychod
public IMiestnost dajVychod(String paSmer)
{
if (aPredmety.containsKey(paSmer)) {
IPredmet predmet = aPredmety.get(paSmer);
if (predmet instanceof IMiestnost) {
return (IMiestnost)predmet;
}
}
return aVychody.get(paSmer);
}
Informatika 2
33
Operátor instanceof(1)
• prvyOperand – hodnota objektového typu
• druhyOperand – typ (trieda, enum, interface)
Informatika 2
34
prvyOperand instanceof druhyOperand
Operátor instanceof(2)
• vracia true ak
– je prvyOperand inštanciou danej triedy
– je prvyOperand inštanciou daného enumu
– je prvyOperand inštanciou triedy implementujúcej
daný interface
• kontroluje typovú kompatibilitu dynamického
typu so zadaným typom
Informatika 2
35
Bezpečné pretypovanie(1)
• operácia pretypovania funguje iba ak
– je hodnota inštanciou danej triedy
– je hodnota inštanciou daného enumu
– je hodnota inštanciou triedy implementujúcej daný
interface
• v opačnom prípade zlyhá a vyhodí behovú chybu
• => nutnosť testovania pomocou operátora
instanceof
Informatika 2
36
Bezpečné pretypovanie(2)
• príkazy sa vykonajú len ak sa dá premenná
pretypovať na daný typ
Informatika 2
37
if (premenna instanceof Typ) {
Typ pretypovana = (Typ)premenna;
// prikazy po bezpecnom pretypovani
}
Interface – štandardná knižnica Javy(1)
• Java knižnica – triedy a interface
• mnohé triedy implementujú interface
• ArrayList – usporiadaný zoznam prvkov
• HashSet – (neusporiadana) množina prvkov
Informatika 2
38
Interface – štandardná knižnica Javy(2)
alebo
• v metódach triedy – parametre a lokálne
premenné rovnakého typu
• čo treba zmeniť, ak zmeníme typ z ArrayList na
HashSet (alebo naopak)?
– všetky definície premenných
• je to možné zjednodušiť?
Informatika 2
39
ArrayList<Predmet> aPredmety
HashSet<Predmet> aPredmety
Interface – štandardná knižnica Javy(3)
• čo majú ArrayList aj HashSet spoločné?
• implementujú interface Collection
– pridávanie a vyberanie prvkov z kontajnera
– prechádzanie kontajnera pomocou cyklu for each
– ...
• definície obsahujú statický typ
• Collection – statický typ
• ArrayList alebo HashSet – dynamický typ
• => využitie polymorfizmu
Informatika 2
40
Interface Collection
Informatika 2
41
Priklad – HashSet(1)
public HashSet<Integer> zlozityAlgoritmus()
{
HashSet<Integer> vysledok =
new HashSet<Integer>();
napln(vysledok);
vypocet(vysledok);
vyhodnot(vysledok);
return vysledok;
}
Informatika 2
42
Priklad – HashSet(2)
public void napln(HashSet<Integer> paVysledok)
{
…
}
public void vypocet(HashSet<Integer> paVysledok)
{
…
}
public void vyhodnot(HashSet<Integer> paVysledok)
{
…
}
Informatika 2
43
Priklad – Collection(1)
public Collection<Integer> zlozityAlgoritmus()
{
Collection<Integer> vysledok =
new ArrayList<Integer>();
napln(vysledok);
vypocet(vysledok);
vyhodnot(vysledok);
return vysledok;
}
Informatika 2
44
Priklad – Collection(2)
public void napln(Collection<Integer> paVys)
{
…
}
public void vypocet(Collection<Integer> paVys)
{
…
}
public void vyhodnot(Collection<Integer> paVys)
{
…
}
Informatika 2
45
Iterátor
• návrhový vzor
• sekvenčné prechádzanie kontajnera po prvkoch
• dvojica interface
– Iterable
– Iterator
• implementované väčšinou kontajnerov
– napr. ArrayList, HashSet, ...
• využíva ho foreach cyklus
Informatika 2
46
Iterable a Iterator
Informatika 2
47
Iterátor – foreach cyklus
• je to isté ako
Informatika 2
48
for (TypPrvkov prvok : kontajner) {
// telo cyklu
}
Iterator<TypPrvkov> prst = kontajner.iterator();
while (prst.hasNext()) {
TypPrvkov prvok = prst.next();
// telo cyklu
}
Collection implementujú
• ArrayList<TPrvok>
• HashSet<TPrvok>
• ...
• vkladanie a vyberanie prvkov z kontajnera
• a iné
Informatika 2
49
Iterable implementujú
• ArrayList<TPrvok>
• HashSet<TPrvok>
• ...
• možno použiť cyklus for each
Informatika 2
50
Rozširovanie interface (extends)
• interface Collection rozširuje Iterable
• => ku správam z Iterable doplní nové
– zjednotenie správ
– pozor: preťažovanie metód
• trieda implementujúca Collection implementuje
aj Iterable
– netreba uvádzať explicitne
Informatika 2
51
public interface Collection<TPrvok>
extends Iterable<TPrvok>
Rozširovanie interface v UML
Informatika 2
52
generalization
Rozširovanie interface v WoF
• IMiestnost
• IPredmet
• INPC
• všetky majú názov
– spoločný interface INazvany
Informatika 2
53
Interface INazvany v hre WoF
Informatika 2
54
Balíčky
Informatika 2
55
Balíčky
• knižnice – rozširujúca funkčnosť
– delí sa na balíčky
– balíčky obsahujú triedy
• podobne:
• program
– delí sa na balíčky
– balíčky obsahujú triedy
Balíčky – Java
• môžu byť ľubovoľne vnorené
• názvy vnorených balíčkov sa oddeľujú bodkou
• príklad: java.util
• balíčky vytvárajú menné priestory
Informatika 2
57
Menný priestor
• identifikátory – mená
– premenná, trieda/enum/interface, metóda, ...
• menný priestor – situácia vyžadujúca
jednoznačné identifikátory
– telo metódy
– telo triedy
– balíček
• menný priestor – kontejner identifikátorov s
jednoznačným určením významu
Informatika 2
58
Riešenie kolízie identifikátorov
• plne kvalifikovaný názov
• FQN – fully qualified name
• FQN identifikátor
– postupnosť názvov balíčkov
– bodková notácia
Informatika 2
59
Využitie iného menného priestoru
• využitie FQN – ak hrozí konflikt
• príkaz import – ak nehrozí konflikt
Informatika 2
60
java.util.ArrayList<Integer> premenna =
new java.util.ArrayList<Integer>();
import java.util.ArrayList;
ArrayList<Integer> premenna =
new ArrayList<Integer>();
Príkaz package
• úplne prvý príkaz v súbore
– súbor: trieda, enum, interface
• nad ním iba komentár
• obsahuje názov balíčka
• každý súbor v balíčku !!!
• prostredie BlueJ automaticky
Informatika 2
61
package nazov;
Nepomenovaný balíček
• každý projekt (aplikácia)
• prvý balíček – nemá meno
• doteraz len také projekty
Informatika 2
62
Reprezentácia balíčkov
• balíček == adresár (zložka, priečinok)
• podbalíčky == podadresáre
• súbory v balíčku == súbory .java v adresári
Informatika 2
63
Názvy balíčkov
• konvencia: prvé písmeno malé, rovnako ako
metódy
• názov balíčka musí byť unikátny !
• odstrašujúci príklad:
– nový balíček „java“ s jednou triedou
– prestane fungovať program
– v starej verzii: prestane fungovať dokonca BlueJ
Informatika 2
64
Unikátnosť názvov balíčkov
• používané riešenie:
• v nepomenovanom balíčku len najvyšší balíček
• najvyšší balíček – vlastné meno, prezývka, názov
firmy, webová doména (viacstupňové vnáranie)
• vnorený balíček – názov programu
• do neho vnorené balíčky – vlastné balíčky
programu
Informatika 2
65
Príklad názvov balíčkov
• nepomenovaný balíček obsahuje
– balíček fri
• balíček fri obsahuje
– balíček hry worldOfFri
• balíček hry obsahuje
– balíčky hra, mapaHry, príkazy, predmety, ...
Informatika 2
66
Výsledné FQN tried WoF
• fri.worldOfFri.hra.Hra
• fri.worldOfFri.predmety.Walkman
• fri.worldOfFri.prikazy.IVykonavac
• ...
Informatika 2
67
Balíčky v prostredí BlueJ
• pridávanie balíčkov
• presúvanie tried medzi balíčkami
Informatika 2
68
Súčasný stav World of FRI
Informatika 2
69
Súčasný stav - NetBeans
Informatika 2
70
Pridanie balíčka
Informatika 2
71
Pomenovanie balíčka
Informatika 2
72
Zobrazenie balíčka
Informatika 2
73
Balíček otvorený v BlueJ
Informatika 2
74
Štruktúra balíčkov vo World of FRI
Informatika 2
75
[fri.worldOfFRI]
Presun triedy do balíčka
Informatika 2
76
Kód pred presunom
public class Hra
{
private Parser aParser;
private Hrac aHrac;
private ITerminal aTerminal;
...
}
Informatika 2
77
Pridanie názvu balíčka
package fri.worldOfFRI.hra;
public class Hra
{
private Parser aParser;
private Hrac aHrac;
private ITerminal aTerminal;
...
}
Informatika 2
78
Automatický presun súboru(1)
Informatika 2
79
Automatický presun súboru(2)
Informatika 2
80
Automatický presun súboru(3)
Informatika 2
81
Rozdelenie tried hry do balíčkov(1)
• hra
– Hra, Hrac
• mapaHry
– MapaHry, IMiestnost, Miestnost
• prikazy
– Parser, Prikaz, NazvyPrikazov, IVykonavac,
VykonavacPomoc, VykonavacChod, VykonavacUkonci,
VykonavacUkaz, VykonavacZober, VykonavacPoloz,
VykonavacPouzi
Informatika 2
82
Rozdelenie tried hry do balíčkov(2)
• predmety
– IPredmet, CiernaDiera, Hodiny, Predmet, Walkman,
Baterky
• vv
– ITerminal, SkutocnyTerminal, TestovaciTerminal
Informatika 2
83
Balíčky v UML – UML .FRI
• ikona balíčka rovnaká
• zoznam tried (enum, interface) v ikone
• vzťahy závislosti medzi balíčkami
Informatika 2
84
Balíčky „World of Fri“ v UML .FRI
Informatika 2
85
Balíček – dokumentačné komentáre
• dokumentačný komentár pre balíček – význam
balíčka ako celku
• nedá sa napísať do súboru s triedou – javadoc
nenájde
• špeciálny súbor package-info.java
Informatika 2
86
Súbor package-info.java
• BlueJ – bez podpory
• vytvorenie v ľubovoľnom textovom editore
– Notepad, PSPad, Notepad++, Scite, CodePad...
– nie Word – textový procesor
Informatika 2
87
Súbor package-info.java – príklad
/**
* Obsahuje vsetky triedy ktore pracuju s hrou.
* Je to hlavne trieda Hra, ktora hru riadi a trieda
* Hrac, ktora reprezentuje hraca hry.
*/
package fri.worldOfFri.hra;
Informatika 2
88
Javadoc pre balíčky
Informatika 2
89
Vďaka za pozornosť
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky