Cvičenia: 12. týždeň

Cieľom cvičení je pozrieť sa na praktické využitie rozhraní, abstraktných tried a metód a modifikátorov viditeľnosti.

Zlomky

  • Upravte triedu Zlomok z predchádzajúcich cvičení tak, aby implementovala rozhranie Comparable<Zlomok>. Vyskúšajte utriediť zlomky pomocou statickej metódy Collections.sort().
  • Pridajte do triedy Zlomok statickú metódu, ktorá spočíta súčet zlomkov.
public static Zlomok sucet(List<Zlomok> zlomky)
  • Pridajte do triedy Zlomok zlomkovú konštantu, ktorá bude reprezentovať jednu polovicu:
List<Zlomok> zoznam = new ArrayList<Zlomok>();
for (int i=0; i<10; i++)
       zoznam.add(Zlomok.POLOVICA);

System.out.println(Zlomok.sucet(zoznam));
  • Vytvorte si vlastné rozhranie Roundable s metódou roundValue. Každá trieda implementujúca tento interface bude schopná vrátiť zaokrúhlenú hodnotu. Pre triedu zlomok metódu implementujte tak, aby vrátila hodnotu zlomku po zaokrúhlení.
  • Vytvorte triedu PorovnavacZlomkov, ktorá bude implementovať rozhranie Comparator<Zlomok>. Zlomky nech sú zoradené podľa vzdialenosti od 1/2 od najväčšej po najmenšiu. Príklad: [3/4, 0/1, 8/2]->[8/2, 0/1, 3/4], príslušné vzdialenosti od 1/2: [3.5, 0.5, 0.25]. Využite triedu PorovnavacZlomkov na utriedenie zoznamu zlomkov a tiež ako parameter v konštruktore triedy TreeSet.

Abstraktné metódy a triedy

  • Diskutujte, ktoré z metód a tried z predchádzajúcich cvičení (napr. v projekte PlochaTvarov) by mali byť zmenené na abstraktné a prečo.
  • Prediskutujte vzťah abstraktných metód a abstraktných tried a nasledovné "pravidlá" na ľahké zapamätanie si použitia slovíčka abstract:
    • abstraktná metóda je metóda bez implementácie - tela (na čo sa to využíva?)
    • abstraktná trieda je trieda, ktorej inštanciu nemožno vytvoriť (na čo sa to využíva?)
    • ak trieda obsahuje aspoň jednu abstraktnú metódu, potom musí byť abstraktná

Body a polárny súradnicový systém

Vytvorte (alebo spomeňte si) triedu Bod, ktorá uchováva súradnice nejakého bodu (double x, double y). Metóda nech má jeden konštruktor: public Bod(double x, double y). Okrem karteziánskeho súradnicového systému však existuje aj tzv. polárny súradnicový systém. V ňom je poloha bodu určená 2 parametrami:

  • jeho vzdialenosťou od stredu súradnicového systému
  • uhlom, ktorý zviera polpriamka prechádzajúca stredom súradnicového systému a daným bodom s osou x.

Navrhnite spôsob, ako pomocou statickej metódy vytvárať objekty triedy Bod na základe určenia jeho súradníc v polárnom súradnicovom systéme. Prediskutujte, či je možné takéto vytváranie bodov realizovať preťažením konštruktorov.

public static Bod zPolarnych(double r, double u)

Využitie rozhraní

  • Navrhnite a implementujte spôsob, ako možno pomocou komparátorov utriediť reťazce (referencie na objekty triedy String) v poli nie lexikograficky, ale podľa dĺžky reťazca - v prípade reťazcov rovnakej dĺžky rozhoduje lexikografické porovnanie.
    • Upravte komparátor tak, aby sa počas triedenia (Arrays.sort) vypísali dvojice, ktoré sa porovnávajú.
    • Upravte komparátor tak, aby ste vedeli spočítať, koľko porovnaní zrealizoval komparátor (metódy: resetujPocitadlo() a getPocetPorovnani())

Rozhrania

Na jednom z predošlých cvičení sme implementovali triedu Bod uchovávajúcu x-ovú a y-ovú súradnicu bodu.

  • Navrhnite triedu sk.upjs.BodovyPorovnavac implementujúcu porovnávanie bodov podľa vzdialenosti od zadaného bodu (b1 < b2 ak bod b1 je k nejakému bodu [x, y] bližšie ako bod b2)
  • Vytvorte triedu sk.upjs.ReverznyBodovyPorovnavac, ktorá bude implementovať rozhranie Comparator<Bod> a v rámci konštruktora dostane referenciu na nejaký Comparator<Bod>. Reverzný porovnávač pri metóde compare bude vracať opačnú hodnotu, ako by vrátil v konštruktore referencovaný komparátor.

Vlastné rozhrania

  • Diskutujte a navrhnite, kde a ako by ste vedeli využiť vlastné rozhrania. Niektorý z príkladov skúste implementovať.

Továreň na tvary

V úlohách venovaných polymorfizmu sme vytvárali triedu Tvar a jej rozšírenia. Vytvorte statickú metódu, ktorá bude na základe reťazca (formát: názov tvaru a medzerami oddelené parametre) vytvárať požadované objekty.

public static Tvar vytvorTvar(String popis)

Pre fajnšmekrov:

  • Ako by ste naprogramovali triedu, ktorej inštancie by bolo možné vytvárať iba cez statickú metódu (cez "továreň" na objekty)?

Príprava na záverečný test