1 / 20

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

Programovanie, algoritmy, zložitosť (UINF / PAZ1c) Diel VI. R óbert Novotný robert.novotny@upjs.sk 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 {

byrd
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programovanie, algoritmy, zložitosť (UINF / PAZ1c)Diel VI. Róbert Novotný robert.novotny@upjs.sk 16. 11. 2007 PAZ1c

  2. 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 { void derivuj() { System.out.println("derivácia funkcie x je 1"); } } • CirkusovýPes zdedí všetky metódy • teda vie štekať • a vie derivovať PAZ1c

  3. Pes-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

  4. Metódy na nájdenie zdedenej metódy • 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(); PAZ1c

  5. Pes-cirkusant a dedičnosť metód • spomnime minule: triedy môžeme prekrývať (override) class Pes { String štekaj() { return "Haf haf"; } } class CirkusovýPes extends Pes { String štekaj() { return "Baf baf baf"; } } Pes dunčo = new Pes(); dunčo.štekaj(); CirkusovýPes cirkusant = new CirkusovýPes(); cirkusant.štekaj(); Pes cirkusant2 = new CirkusovýPes(); cirkusant2.štekaj(); Haf haf Baf baf baf Baf baf baf PAZ1c

  6. Ešte zložitejšia dedičnosť metód • 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. zavolá sa metóda uvedená v triede Pes class CirkusovýPes extends Pes { String štekaj() { String stekanie = super.štekaj(); return stekanie + " Príďte do nášho Cirkusu™."; } } v tomto prípade je super typu Pes super je zvláštna premenná takého typu, aký má predok PAZ1c

  7. Hudobné nástroje z minulého dielu public class HudobnýNástroj { void zahraj(int tón) { //tu sa nič nedeje } } • Zamyslime sa: HudobnýNástroj n = new HudobnýNástroj(); • Má to význam? PAZ1c

  8. Hudobné 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

  9. Hudobné nástroje jednoducho neexistujú... • Riešenie: abstraktné triedy • abstraktné triedy reprezentujú abstraktné pojmy, či entity • ,,Divím sa, že sa divím, že sa divím..." • z abstraktnej triedy nemožno vytvárať inštancie public abstract class HudobnýNástroj { ... } Cannot instantiate type / Nemôžem vytvoriť inštanciu typu HudobnýNástroj n = new HudobnýNástroj(); PAZ1c

  10. Abstraktné triedy i metódy • 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)". public abstract class HudobnýNástroj { abstractvoid zahraj(int tón); } žiadne kučeravé zátvorky! • každý hudobný nástroj (flauta, trúba...) musí vedieť zahrať tón len hlavička s bodkočiarkou PAZ1c

  11. Abstraktné 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

  12. Nač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 milujem abstraktné umenie PAZ1c

  13. Dedí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; } } The variablePes.vek is not visible! / Premenná Pes.vek nie je viditeľná! Táto premenná by sa mala zdediť. PAZ1c

  14. Dedíme aj inštančné premenné • 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; } } PAZ1c

  15. Viditeľnosť • 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 PAZ1c

  16. Viditeľnosť premenných • 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 PAZ1c

  17. Príklad použitia v projekte JukeBox public abstract class JukeBox { protectedString 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

  18. Príklad použitia v projekte JukeBox 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 PAZ1c

  19. Príklad použitia v projekte JukeBox 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 PAZ1c

  20. Príklad použitia v projekte JukeBox 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 instantiate type / Nemôžem vytvoriť inštanciu typu PAZ1c

More Related