R óbert Novotný [email protected] 16. 11. 2007
description
Transcript of R óbert Novotný [email protected] 16. 11. 2007
PAZ1c
paz1c
Róbert Novotný[email protected]
16. 11. 2007
Programovanie, algoritmy,
zložitosť (UINF / PAZ1c)
Diel VI.
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ť
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
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
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
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
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
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.
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
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
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
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
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á!
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é
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ť
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
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
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
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
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