Úloha číslo 4

Dědičnost a agregace

Jan Pavlovič

Petr Adámek

Abstract

Cílem této úlohy je naučit se používat dědičnost.


Table of Contents

Co je potřeba znát
Zadání
Několik rad
Odevzdání úlohy
Metodické pokyny
Pokyny pro opravování

Co je potřeba znát

Pro vyřešení této úlohy je třeba

  • Rozumět principům objektového programování v jazyce Java.

  • Umět pracovat s rozhraními (klíčové slovo interface).

  • Chápat princip dědičnosti včetně abstraktních tříd.

  • Umět použít výčtový typ (Enum).

Zadání

V této úloze bude Vaším úkolem imlementovat tři třídy, které budou reprezentovat grafické objekty ve 2D prostoru. Grafický objekt je reprezentován rozhraním GraphicShape a kromě vlastností specifických pro daný typ objektu (poloměr u kruhu apod.) má vždy nějakou barvu. Dále je možné u každého objektu spočítat jeho obsah a získat jeho textový popis.

Kromě několika rozhraní popisujících požadované třídy máte k dispozici třídu Point, která reprezentuje bod v dvourozměrném prostoru, a třídu Color, což je výčtový typ reprezentující barvu.

Nejdříve implementujte abstraktní třídu AbstractGraphicShape, která bude předkem pro všechny grafické objekty a bude obsahovat jejich společné metody a atributy. Třída bude implementovat rozhraní GraphicShape a bude obsahovat atribut color reprezentující barvu objektu. Dále bude obsahovat konstruktor, který inicializuje hodnotu tohoto atributu, a metodu getColor(), která hodnotu atributu vrátí.

Dále vytvořte třídu CircleImpl, která bude implementovat rozhraní Circle. Kromě metod, jejichž popis naleznete v příslušném rozhraní, bude mít konstruktor s parametry typu Color, Point a double. První bude definovat barvu, druhý střed a třetí poloměr kruhu. Metody getCenter() a getRadius() tyto hodnoty vrátí. Metoda getArea() spočítá a vrátí obsah kruhu a toString() vrátí popis objektu ve formátu "Circle with center [<x>, <y>], radius <r> and color <color>", kde místo "<x>", "<y>", "<r>" a "<color>" budou konkrétní hodnoty příslušných vlastností.

Analogicky vytvořte třídu TriangleImpl, která implementuje rozhraní Triangle. Na rozdíl od kruhu je trojúhelník definován pomocí tří vrcholů. Třída bude mít konstruktor s jedním parametrem typu Color a s třemi parametry typu Point, které budou definovat barvu a jednotlivé vrcholy trojúhelníku. Metody getVertexA(), getVertexB() a getVertexC() tyto vrcholy vrátí. Dále bude třída obsahovat metody getSideA(), getSideB() a getSideC(), které spočítají a vrátí délku příslušné strany trojúhelníku. Metoda getArea() spočítá a vrátí obsah trojúhelníku a toString() vrátí popis objektu ve formátu "Triangle with vertices [<x>, <y>], [<x>, <y>], [<x>, <y>] and color <color>", kde místo "<x>", "<y>" a "<color>" budou konkrétní hodnoty příslušných vlastností.

K dispozici máte tři testovací třídy, pro každou z Vámi vytvořených tříd jednu. Můžete tak testovat jednotlivé třídy postupně a nemusíte testování odkládat až na konec. Testovací třídy slouží jako formální zadání. To znamená, že správné řešení je takové, které úspěšně projde všemi testy.

Několik rad

  • Obsah kruhu spočítáte pomocí následujícího fragmentu kódu:

    double area = Math.PI * radius * radius;

    kde radius je poloměr kruhu.

  • Obsah trojúhelníku spočítáte pomocí následujícího fragmentu kódu

    double s = (a+b+c)/2;
    double area = Math.sqrt(s*(s-a)*(s-b)*(s-c));

    kde a, b a c jsou délky jednotlivých stran trojúhelníku.

  • Vzdálenost dvou bodů v dvojrozměrném prostoru se spočítá např. pomocí metody

    private double getLineSegmentLength(Point from, Point to) {
        int dX = Math.abs(from.getX() - to.getX());
        int dY = Math.abs(from.getY() - to.getY());
        return Math.sqrt(dX*dX + dY*dY);
    }
  • Označení strany trojúhelníku vždy koresponduje s označením protilehlého vrcholu, takže strana a vede z vrcholu B do vrcholu C.

Další rady a návody jak řešit některé z potenciálních problémů Vám poskytnou cvičící v příslušném cvičení.

Odevzdání úlohy

Před odevzdáním úlohy si zkontrolujte:

  1. Zda jde úloha přeložit a zda jdou přeložit i všechny testy.

  2. Zdali všechny testy projdou bez chyby.

  3. Zda jste nezapomněli správně vyplnit hlavičky všech tříd ve formátu JavaDoc (popis třídy, autor, popis všech metod, apod.)

Metodické pokyny

Je důležité studentům vysvětlit dekompozici této úlohy a význam všech jejích tříd. Zdůrazněte princip abstraktní třídy a proč se používá (obecně i v tomto případě). Upozorněte na paralelní hierarchii dědičnosti a vysvětlete výhody tohoto uspořádání. Vysvětlete také rozdíl mezi agregací a dědičností, a proč není kruh potomkem třídy bod.

Pokyny pro opravování

  • Prověřte, že studenti do hlaviček tříd správně doplnili své jméno a popis třídy.

  • Prověřte, že studenti neporušují princip zapouzdření.