Uschovna geometrickych obrazcu ============================== Priklad na procviceni: - rozhrani - implementace metody equals - pole - cykly Vytvorte rozhrani Shape s jedinou metodou: double getArea() vrati obsah geometrickeho obrazce Vytvorte tri implementace rozhrani Shape, ktere krome implementace metody getArea() budou obsahovat vhodny konstruktor: - class Circle konstruktor: Circle(double r) r = polomer - class Rectangle konstruktor: Rectangle(double a, double b) a, b = delky stran - class Triangle konstruktor: Triangle(double a, double b, double c) Pro vypocet obsahu kruhu se vam muze hodit konstanta pi: Math.PI Pro vypocet obsahu trojuhelnika pouzijte Heronuv vzorec (http://cs.wikipedia.org/wiki/Troj%C3%BAheln%C3%ADk) a metodu Math.sqrt(double), ktera vraci odmocninu realneho cisla. Pro kazdou z techto tri trid rovnez napiste metodu boolean equals(Object o) ktera otestuje, zda parametr o obsahuje instanci stejne tridy, ktera ma stejne delky stran (resp. polomeru). U testovani delek nemusite brat ohled na symetrie (pokud vylozene nechcete :)). Napr. u obdelnika staci overit, ze r1.a == r2.a && r1.b == r2.b Situaci r1.a == r2.b && r1.b == r2.a obecne neni nutne povazovat za ekvivalenci objektu. Vytvorte tridu ShapeStorage, ktera bude predstavovat jednoduchou databazi geometrickych obrazcu, s nasledujicimi metodami: - konstruktor: ShapeStorage(int maxShapes) maxShapes = kapacita databaze - void add(Shape s) prida obrazec do databaze - double getTotalArea() vrati celkovou plochu vsech ulozenych obrazcu Pro ulozeni geom. tvaru pouzijte pole. Pro narocne: Do tridy ShapeStorage pridejte nasledujici metody: - boolean exists(Shape s) vrati true, pokud v databazi existuje obrazec o takovy, ze s.equals(o), jinak false - void removeFirst(Shape s) odstrani z databaze prvni nalezeny obrazec o takovy, ze s.equals(o) - void removeAll(Shape s) odstrani z databaze vsechny obrazce o takove, ze s.equals(o) Poznamky k implementaci ======================= Implementace rozhrani Shape --------------------------- Mela by byt u vsech trid vicemene primocara. Problemy muze pusobit snad jen metoda equals. Vzorova implementace pro tridu Circle: public boolean equals(Object o) { if (o instanceof Circle) { Circle c = (Circle) o; return (this.r == c.r); } else { return false; } } Trida ShapeStorage ------------------ - Deklarujte si promennou, ve ktere budete udrzovat aktualni pocet prvku v databazi (v poli). - V konstruktoru nezapomente vytvorit pole odpovidajici delky (podle zadaneho parametru). - V implementaci metody add dejte pozor na situaci, kdy databaze je jiz plna. V takovem pripade vypiste na standardni vystup chybovou hlasku. Korektni reseni by zde bylo vyhozeni vyjimky. Ty jsme vsak dosud neprobirali. - V metode removeFirst dejte pozor, aby vam v poli nevznikaly "diry". Elegantni reseni je nahradit odstranovany prvek poslednim prvkem v poli a na misto posledniho prvku v poli vlozit null. Nezapomente snizit promennou, ve ktere drzite pocet prvku v poli. - Metodu removeAll muzete snadno implementovat s vyuzitim metod exists a removeFirst.