Table of Contents
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
).
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
"
", kde místo "<x>", "<y>" a
"<color>" budou konkrétní hodnoty příslušných vlastností.Triangle with vertices [<x>, <y>],
[<x>, <y>], [<x>, <y>] and color
<color>
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.
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í.
Před odevzdáním úlohy si zkontrolujte:
Zda jde úloha přeložit a zda jdou přeložit i všechny testy.
Zdali všechny testy projdou bez chyby.
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.)
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.