r óbert novotný [email protected] 16. 11. 2007

20
PAZ1c paz1c Róbert Novotný [email protected] 16. 11. 2007 Programovanie, algoritmy, zložitosť (UINF / PAZ1c) Diel VI.

Upload: byrd

Post on 02-Feb-2016

48 views

Category:

Documents


0 download

DESCRIPTION

Programovanie, algoritmy, zložitosť (UINF / PAZ1c) Diel VI. R óbert Novotný [email protected] 16. 11. 2007. Pes-matematik a dedičnosť metód. Chceme zaviesť psa-cirkusanta. class Pes { private int vek; String štekaj() { return "Haf haf"; } }. class CirkusovýPes extends Pes { - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

Róbert Novotný[email protected]

16. 11. 2007

Programovanie, algoritmy,

zložitosť (UINF / PAZ1c)

Diel VI.

Page 2: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cPes-matematik a dedičnosť metód

• Chceme zaviesť psa-cirkusantaclass CirkusovýPes extends Pes {

void derivuj() {

System.out.println("derivácia funkcie x je 1");

}

}

class Pes {

private int vek;

String štekaj() {

return "Haf haf";

}

}

• CirkusovýPes zdedí všetky metódy– teda vie štekať– a vie derivovať

Page 3: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cPes-matematik a dedičnosť metód

class CirkusovýPes extends Pes {void derivuj() {

System.out.println("derivácia funkcie x je 1");}

}

CirkusovýPes cirkusant = new CirkusovýPes();

cirkusant.štekaj();

• pozrieme sa do CirkusovéhoPsa• má uvedenú metódu štekaj()?

– áno – zavoláme ju a šlus– nie – pozrieme sa do predka

• má predok (Pes) metódu štekaj()?– áno – zavoláme ju a šlus– ak náhodou nie – pozrieme sa do predka

• keďže prapra...predkom je Object, určite raz skončíme.

• ak sa metóda nenájde ani v Object-e, tak máme syntaktickú chybu

Page 4: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

• pozrieme sa do danej triedy• má uvedenú danú metódu?

– áno – zavoláme ju a šlus– nie – pozrieme sa do nadradenej triedy a

opakujeme algoritmus

• prinajhoršom skončíme v Object-e

• typickým príkladom sú metódy equals(), hashCode() a toString();

Metódy na nájdenie zdedenej metódy

Page 5: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

• spomnime minule: triedy môžeme prekrývať (override)

class CirkusovýPes extends Pes {

String štekaj() {

return "Baf baf baf";

}

}

class Pes {

String štekaj() {

return "Haf haf";

}

}

Pes dunčo = new Pes();

dunčo.štekaj();

CirkusovýPes cirkusant = new CirkusovýPes();

cirkusant.štekaj();

Pes cirkusant2 = new CirkusovýPes();

cirkusant2.štekaj();

Haf hafBaf baf bafBaf baf baf

Pes-cirkusant a dedičnosť metód

Page 6: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

• niekedy chceme len rozšíriť správanie z predka

• napr. chceme, aby cirkusový pes štekal ako každý iný pes, ale na koniec štekania vložil reklamu na svoj cirkus.

class CirkusovýPes extends Pes {

String štekaj() {

String stekanie = super.štekaj();

return stekanie + " Príďte do nášho Cirkusu™.";

}

}

zavolá sa metóda

uvedená v triede Pes

v tomto prípade je super typu

Pes

Ešte zložitejšia dedičnosť metód

super je zvláštna

premenná takého typu, aký

má predok

Page 7: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cHudobné nástroje z minulého dielu

• Zamyslime sa:HudobnýNástroj n = new HudobnýNástroj();

• Má to význam?

public class HudobnýNástroj {void zahraj(int tón) {//tu sa nič nedeje

}

}

Hudobný nástroj

Husle Flauta Lesný roh

Page 8: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cHudobné nástroje z minulého dielu

HudobnýNástroj n = new HudobnýNástroj();

• Má význam dovoliť používateľovi vytvárať inštancie hudobných nástrojov?– náš úplne všeobecný hudobný nástroj,

zovšeobecňujúci flauty, rohy... v skutočnosti nemôže existovať.

Huh?Dobrý deň.

Zabaľte mi jeden nástroj.

Page 9: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cHudobné nástroje jednoducho neexistujú...

public abstract class HudobnýNástroj {

...

}

š č

žž

žšť

HudobnýNástroj n = new HudobnýNástroj();

Cannot instantiat

e type/

Nemôžem vytvoriť

inštanciu typu

Page 10: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cAbstraktné triedy i metódy

public abstract class HudobnýNástroj {

abstract void zahraj(int tón);

}

• Aj metódy môžu byť abstraktné

• Abstraktná metóda = ,,ja nerobím nič, ale moji dedičia musia túto metódu prekryť (override)".

žiadne kučeravé zátvorky!

len hlavička s bodkočiarkou

• každý hudobný nástroj (flauta, trúba...) musí vedieť zahrať tón

Page 11: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cAbstraktné triedy i metódy

•Pravidlo: ak sa v triede abstraktnú metódu, celá trieda musí byť abstraktná.

•Príklad:

• biológ: každý vták lieta

• informatik: trieda Vták má abstraktnú metódu lietaj(). Trieda (Európska)Lastovička lieta tak, že 15krát za sekundu zamáva krídlami.

public class Vták {

abstract void lietaj();

}

Vták f = new Vták();

f.lietaj();

Čo sa podľa vás má

stať, vážení diváci?

abstract class Vták

Page 12: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cNačo je to dobré?

• abstraktná trieda môže vo svojich metódach robiť mnoho vecí, ale niektoré druhy správania chce nechať na zodpovednosť dedičom

• niektoré druhy správania chce vyžadovať od dedičov

• používané ako doplnok k rozhraniam (interface-om) – o tom neskôr

Abstract

milujem abstraktné umenie

Page 13: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cDedíme aj inštančné premenné

• každá trieda zdedí okrem metód aj inštančné premenné.

class Pes {

private String rasa;

private int vek;

}

class CirkusovýPes extends Pes {

public String toString() {

return "Cirkusant " + rasa;

}

}

Táto premenná by sa mala

zdediť.

The variable Pes.vek is not visible!

/Premenná Pes.vek nie je

viditeľná!

Page 14: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

• spomeňme si na privátne premenné• k privátnym premenným môže pristupovať

len kód v danej triede• riešenie: chránené (protected) premenné• k protected premenným môže pristupovať

– kód v danej triede– kód v zdedených triedach– kód v triedach, ktoré sa nachádzajú v rovnakom balíčku

class Pes {

protected String rasa;

protected int vek;

}

class CirkusovýPes extends Pes {

public String toString() {

return "Cirkusant " + rasa;

}

}

Dedíme aj inštančné premenné

Page 15: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

• verejné (public) premenné sa tiež zdedia– také premenné by však v triede nemali

byť.

• kedy private a kedy protected?– privátne inštančné premenné sú určené

len a len danej triede.– nepredpokladá sa, že k nim budú mať

prístup zdedené triedy– chránené sú určené ,,blízkej rodine" a

dedičom

• rady starej matere: je lepšie označiť premennú ako private a v prípade potreby ju zmeniť na protected

P R IV A TE P R O P E R TY

T R E SP A SSE R SW IL L B E SH O T

SU R V IV O R S W IL L B E SH O T A G A IN

Viditeľnosť

Page 16: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

Príklad: trieda Otec a inštančná premenná Pivo

• privátna (private) = len otec môže piť pivo

• chránená (protected) = pivo môže vypiť len otec a môže mu ho vypiť synček alebo iný člen rodiny (= balíčka)

• verejná (public) = pivo môže vypiť otcovi hocikto

Viditeľnosť premenných

Page 17: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1cPríklad použitia v projekte JukeBox

public abstract class JukeBox {protected String meno;public void hrajVšetky() {for(CD cd : getCDs()) {

cd.zahraj();}

}protected abstract ArrayList<CD> getCDs();

}

• Všetcí prípadní potomkovia JukeBox-u budú mať meno

• JukeBox vie prehrať CDčka, ktoré v ňom sú

• To, odkiaľ sa získa zoznam CDčiek, sa prenechá na potomkov

Page 18: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

public class SúborovýJukeBox extends JukeBox {

protected ArrayList<CD> getCDs() {

ArrayList<CD> cds = new ArrayList<CD>();

File súbor = new File("C:/MP3");

for(File podsúbor : súbor.list()) {

CD cd = new CD();

cd.setNázov(podsúbor.getName());

cds.add(cd);

}

return cds;

}

}

vypíše súbory v danom adresári

názov súboru

Príklad použitia v projekte JukeBox

Page 19: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

public class DatabázovýJukeBox extends JukeBox {

protected ArrayList<CD> getCDs() {

Databáza db = Databáza.getDatabáza();

ArrayList<CD> cds = db.vykonajDopyt("SELECT * FROM cd ORDER BY 1");

return cds

}

}

nejaká zázračná trieda pracujúca s SQL databázou

Príklad použitia v projekte JukeBox

Page 20: R óbert Novotný robert.novotny@upjs.sk 16. 11. 2007

PAZ1c

paz1c

public static void main(String[] args) {

JukeBox j = new JukeBox();

j.hrajVšetko();

j = new SúborovýJukeBox();

j.hrajVšetko()

j = new DatabázovýJukeBox();

j.hrajVšetko();

}

Cannot instantiat

e type/

Nemôžem vytvoriť

inštanciu typu

Príklad použitia v projekte JukeBox