Rozbudowanie klasy - problem projektowy

0

Jako, że to mój pierwszy post na tym forum to na wstępie się przywitam: Witam. :)

Mam pewien problem projektowy i kilka możliwych rozwiązań. Nie wiem, które najlepiej będzie zastosować. Do rzeczy.
Piszę małe co nieco przy użyciu biblioteki SFML. Znajduję się tam klasa Shape, która jak się można domyślić służy tworzeniu i rysowaniu kształtów. Nie oferuje jednak żadnej metody umożliwiającej stwierdzenie czy podany punkt znajduje się wewnątrz kształtu. Więc chciałbym sobie dostarczyć jakieś "bool contains(Point p)". No i do głowy przychodzą mi trzy wyjścia i każde ma swoje wady i zalety:

  1. Rozbudować klasę Shape poprzez dziedziczenie.
    Rozwiązanie ma oczywiste zalety, ale jedną poważną wadę. W SFML po Shape dziedziczą już jakieś konkretne kształty jak Circle, Rectangle, itp. Gdybym więc sobie tak rozbudował tę klasę to bym właściwie utracił dostarczone przez SFML klasy pochodne. Bo one już by moich poprawek nie otrzymały. Musiał bym z mojej nowej klasy sam tego typu pochodne tworzyć.

  2. Rozbudować klasę, ale nie przez dziedziczenie. tylko przez takie jakby obudowanie jej. Tj. stworzyć sobie nową klasę, która będzie miała pole będące wskaźnikiem na SFMLowego Shape'a. Będę sobie tworzył obiekt własnej klasy i dostarczał mu Shape. Wtedy po mojej klasie mogą sobie dziedziczyć konkretne kształty, które będą miały dodatkowe pole będące wskaźnikiem na odpowiadający im kształt pochodny po SFMLowym Shape. Rozwiązanie to jednak mi jakoś tak śmierdzi. Głównie śmierdzi syfem w kodzie poprzez namnażanie się klas, które niewiele co wnoszą.

  3. Prostackie stworzenie globalnej funkcji nie powiązanej z żadną klasą, która przyjmuje Shape i punkt i zwraca boola. Niby fajnie tylko tracę tu polimorfizm. Takie Circle albo Rectangle mogłyby znacznie prościej i zarazem szybciej sprawdzać czy zawierają punkt niż taka ogólna funkcja działająca dla dowolnego kształtu. Tracę więc tu polimorfizm, który jest fajny.

Tak więc zdecydować się nie mogę i liczę na jakąś podpowiedź. Może inne pomysły? Może są jakieś wzorce projektowe o których nie słyszałem, a doskonale się nadają by tu zastosować...

0

Więc masz klasę

class Shape
{
    public: virtual void draw() = 0;
};

i chcesz mieć metodę sprawdzającą czy punkt należy do kształtu?

Proponuję zrobienie tego tak (z zachowaniem bezpieczeństwa typów oraz ISP):

class Region
{
    public: virtual bool contains(Point p) = 0;
};

class RectangleRegion : public Region
{
public:
    RectangleRegion(RectangleShape *rs) { ... }
    virtual bool contains(Point p) { ... }
};

class CircleRegion : public Region
{
public:
    CircleRegion(CircleShape *rs) { ... }
    virtual bool contains(Point p) { ... }
};

Jakieś potencjalne wady takiego rozwiązania? Jedyne co mi przychodzi do głowy, to to że jeśli metoda potrzebuje jednocześnie narysować figurę i sprawdzić czy punkt do niej należy to potrzebuje dwóch parametrów a nie jednego (można to ew. rozwiązać tworząc klasę BoundedShape zawierającą metody getShape() i getRegion()).

1 użytkowników online, w tym zalogowanych: 0, gości: 1