Polimorfizm : biblioteka kształtów --------------------------------------- Polimorficzne zachowanie klas bardzo często tłumaczone jest na przykładzie hierarchii klas opisujących figury geometryczne: koła, kwadraty, itp. Każda z klas umie narysować swój kształt - każda inny. W tym przykładzie kształty będą rysowane w tekstowym formacie SVG, np poniżej mamy narysowane koło i kwadrat: .. literalinclude:: output.svg :language: xml :linenos: Zauważ, że plik w formacie ma nagłówek (element ````) oraz stopkę (````). Tworzenie hierarchii klas zaczniemy od zdefiniowania klasę bazowej ``Shape``: .. literalinclude:: svg_shapes.py :language: python :linenos: :lines: 44-50 Wszystkie klasy potomne odziedziczą chronione pole ``_id``; pamiętaj o odpowiednim wywołaniu konstruktora klasy bazowej. Klasy potomne będą również musiały zaimplementować abstrakcyjną metodę ``draw()``, zwracającą odpowiedni fragment tekstu w formacie SVG. Tu własnie obserwujemy zachowanie polimorficzne: wywołanie ``draw()`` w każdej z klas coś narysuje, choć ów kształt dla każdej z klas będzie inny. Szczególnym przypadkiem jest klasa ``Group``, która sama z siebie nie ma kształtu; możliwe jest jej narysowanie poprzez narysowanie wszystkich jej składowych. Aby rozwiązać to zadanie: 1. dokończ klasę bazową ``Shape`` 2. stwórz klasy potomne, rysujące linię (``Line``), koło (``Circle``) i prostokąt (``Rectangle``). 3. stwórz też klasę ``Group``, która również powinna dziedziczyć po ``Shape``. 4. stwórz klasę przechowującą styl danego elementu (tzn kształtu lub grupy) 5. stwórz klasę ``SvgDrawing``, który _rysuje_ obrazek w formacie SVG, czyli wywołuje metodę ``draw()`` z każdego z elementów i nagrywa wygenerowany w ten sposób tekst do pliku w formacie SVG Oto zalążek kodu, wymieniający główne elementy, które należy zaimplementować: .. literalinclude:: svg_shapes.stub.py :language: python :linenos: Ukończona biblioteka klas powinna umożliwić poprawne wykonanie testu jednostkowego: .. raw:: html
Test jednostkowy dla biblioteki kształtów .. literalinclude:: TestSvgShapes.py :language: python :linenos: .. raw:: html
Biblioteką możesz teraz tworzyć dowolne obrazy, lub wykresy, np jak ten: .. image:: plot.png :width: 400 :alt: Wykres narysowany z wykorzystaniem biblioteki SVG .. raw:: html
Kod programu rysujący powyższy wykres .. literalinclude:: sin_cos_plot.py :language: python :linenos: .. raw:: html