PDF

Polymorfizmus-balíčky

Šestnásta prednáška

Formát
PDF
Veľkosť
4,5 MB
Pridané
Stiahnutí
1 042
Stiahnuť PDF · 4,5 MB

Preber 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.

Otvoriť AI: ChatGPT · Claude · Gemini

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.