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 ````).
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