Cieľom cvičení deviateho týždňa je pozrieť sa na praktické využitie dedičnosti a polymorfizmu. 
Tvar
- Vytvorte triedu 
Tvar, ktorá bude uchovávať súradnice x a y stredu nejakého geometrického tvaru a jeho farbu.
 - Vytvorte potomkov triedy 
Tvar (k všetkým si dodajte potrebné inštančné premenné):
 - Umožnite, aby sa každý tvar vedel vykresliť na 
WinPane z JPaz2 frameworku:
- kreslenie tvaru prebieha cez zavolanie metódy 
vykresliSa(Pane plocha)
 - metóda 
vykresliSa nech je definovaná v triede Tvar (pri jej volaní nad touto triedou, nech sa vypíše do System.err chybová hláška) a v triedach Kruh a Obdlznik nech je táto metóda vhodne prekrytá.
 
 
  public void vykresliSa(Pane plocha)
 
  
 
 - Vytvorte metódu (v triede 
Tvar a prekrytú v oddedených triedach), ktorá vráti, či bod so súradnicami [x, y] je vnútorným bodom daného tvaru:
 
  public boolean jeVnutornyBod(double x, double y)
 
  
 
 Zoznam tvarov
- Vytvorte triedu 
ZoznamTvarov ktorá bude obsahovať všetky tvary v poli typu Tvar[]. 
- vytvorte vhodné metódy na pridávanie nových tvarov do zoznamu tvarov
 - vytvorte metódu 
nakresliVsetky(Pane plocha), ktorá vykreslí všetky tvary do zadanej kresliacej plochy Pane
 - vytvorte vlastnú triedu rozširujúcu kresliacu plochu 
WinPane, ktorej objekty budú v sebe udržiavať vlastný ZoznamTvarov
 - vytvorte metódu 
posun(double dx, double dy), ktorá posunie všetky tvary v smere zadaného vektora [dx, dy]
 - vytvorte metódu 
bodTvaru(double x, double y), ktorá vráti objekt triedy Tvar, ktorého vnútorným bodom je bod so súradnicami [x, y]
 - vytvorte metódu na odstránenie tvaru, zo zoznamu tvarov
 - vytvorte metódu 
posunSmerom(double uhol, double vzdialenost), ktorá posunie všetky tvary daným smerom o danú vzdialenosť
 
 
Štruktúra triedy 
ZoznamTvarov:
  import sk.upjs.jpaz2.Pane;
public class ZoznamTvarov {
        //???
        public void pridajTvar(Tvar t) {
                //???
        }
        public void nakresliVsetky(Pane plocha) {
                //???
        }
        public void posun(double dx, double dy) {
                //???   
        }
        public Tvar bodTvaru(double x, double y) {
                return null;
        }
        public void odstranTvar(Tvar t) {
                //???
        }
}
 
  
 
 Návrh triedy rozširujúcej 
WinPane na experimentovanie s tvarmi:
  import java.awt.event.MouseEvent;
import sk.upjs.jpaz2.WinPane;
public class PlochaTvarov extends WinPane {
        private ZoznamTvarov tvary;
        private double dragX;
        private double dragY;
        private boolean tahanie = false;
        public PlochaTvarov() {
                this.tvary = new ZoznamTvarov();
        }
        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        if (detail.isAltDown()) {
                                this.tvary.pridajTvar(new Kruh(???));
                        } else {
                                this.tvary.pridajTvar(new Obdlznik(???));
                        }
                }
                if (detail.getButton() == MouseEvent.BUTTON3) {
                        Tvar naOdstranenie = this.tvary.bodTvaru(x, y);
                        if (naOdstranenie != null) {
                                this.tvary.odstranTvar(naOdstranenie);
                        }
                }
                this.clear();
                this.tvary.nakresliVsetky(this);
        }
        @Override
        protected void onMousePressed(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = true;
                        this.dragX = x;
                        this.dragY = y;
                }
        }
        @Override
        protected void onMouseDragged(int x, int y, MouseEvent detail) {
                if (this.tahanie) {
                        tvary.posun(x - this.dragX, y - this.dragY);
                        this.dragX = x;
                        this.dragY = y;
                        this.clear();
                        this.tvary.nakresliVsetky(this);
                }
        }
        @Override
        protected void onMouseReleased(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = false;
                }
        }
}
 
  
 
 Tvary v súroborch
- vymyslite spôsob, akým by ste vedeli všetky tvary uchovávať v textovom súbore
- vytvorte metódu na uloženie tvarov do textového súboru
 - vytvorte metódu na vytvorenie zoznamu tvarov čítaním tohto textového súboru
 
 
Obsahy tvarov
- Vytvorte vo vhodných triedach metódu 
obsah(), ktorá vráti obsah daného útvaru
 - Zotrieďte zoznam tvarov podľa obsahu a vypíšte na konzolu tento zoznam
 
Ďalšie tvary (Tvary++)
- Vytvorte ďalšie triedy a zvoľte im vhodných rodičov 
 - pre fajnšmekrov: Vytvorte triedu 
Krivka - potomka triedy Tvar  - vytvorenú myšacími udalosťami 
 
Polymorfizmus
- Nájdite a diskutujte o rôznych príkladoch, kde by išlo využiť dedičnosť a polymorfizmus (jednotlivé príklady môžete skúsiť aj implementovať). 
 
Konštruktory
- Rozdiskutujte a na príkladoch vysvetlite pravidlá:
- Každá trieda v Jave musí mať konštruktor. Ak programátor nenapíše žiaden konštruktor, Java vytvorí implicitný konštruktor.
 - Prvý príkaz každého konštruktora je volanie konštruktora rodičovskej triedy alebo iného konštruktora danej triedy. Ak to tak nie je, Java pridá pred prvý riadok volanie bezparametrového konštruktora rodičovskej triedy (
super();).
 
 
Výstava psov
Vytvoríme program, ktorý pomôže organizátorom výstavy psov. O každom súťažiacom vieme meno psa, meno majiteľa, rasu psa, vek psa a hodnotenie psa od piatich rozhodcov.
Zoznam súťažiacich sa nachádza v textovom súbore vystava.txt
- Vytvorte triedu 
Pes, kde sú uložené všetky uvedené informácie o jednom súťažiacom. Trieda ZoznamPsov, ktorá bude spravovať zoznam objektov triedy Pes.
 - V triede 
Pes vytvorte metódu na výpis všetkých známych informácií o danom psovi.
 - Naplňte zoznam psov cez načítanie údajov z textového súboru 
 - Vytvorte metódu na výpis informácií o všetkých súťažiacich psoch, využite metódu z druhého bodu.
 - Vytvorte metódu, ktorá vypočíta a vhodne uloží celkové hodnotenie psa na základe ohodnotení od rozhodcov. 
 - Vytvorte metódu 
vypisVitaza(), ktorá vypíše informácie o víťaznom psovi, teda o psovi, ktorý má najvyššie priemerné ohodnotenie od rozhodcov.
 
O kuchárskej knihe a chladničke
Chcete implementovať kuchársku knižku. Každý recept má najprv zoznam surovina-mnozstvo a potom text s "algoritmom" teda poradím ako jednotlivé suroviny použiť.
- chcete vedieť vypísať všetky recepty
 - chcete vypísať recept podľa názvu jedla
 - pre daný obsah chladničky a špajzy (zoznam surovina-množstvo) chcete vypísať tie recepty, ktoré sa dajú navariť
 
Aké triedy je treba vytvoriť na riešenie tejto úlohy? Čo by mali jednotlivé triedy uchovávať a akými metódami by mali disponovať?