Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Poniedziałek, 16 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO



Problem wspólnego interfejsu

Zasadniczym celem stosowania wzorca projektowego Kompozyt jest dostarczenie klientowi takiego interfejsu, na którym może jednakowo pracować zarówno z liśćmi jak i z kompozytami – bez rozróżniania ich. Pojawia się tutaj problem wspólnego interfejsu - np. gdzie najlepiej umieścić metody tożsame z dodajPotomka() - w kompozycie (HubUSB) czy w komponencie (UrzadzenieUSB)?

Pierwsze rozwiązanie zostało wykorzystywane w prezentowanym do tej pory kodzie przykładowym. O ile nie ma problemu, aby tworzyć kompozyty to ich modyfikacja w późniejszym etapie jest niemożliwa, ponieważ na pierwszym i kolejnych poziomach kompozytów klient posługuje się interfejsem UrzadzenieUSB, które metod dodajUrzadzenie() nie posiada. Co prawda można próbować rzutowania dynamic_cast<HostUSB *>, ale to sprawia że podstawowe założenie kompozytu dotyczące niezależnego traktowania interfejsów przestaje obowiązywać.

Z drugim rozwiązaniem wiąże się inny problem – jeśli doda się do interfejsu UrzadzenieUSB metody dodajUrzadzenie() i usunUrzadzenie() to z kolei jakie zadanie powinno być wykonane dla takich metod przez elementy liści? Czy nie łamie się tutaj zasady programowanie obiektowego, mówiącej że metody powinny być definiowane dla klas, które ich potrzebują?

Mimo wszystko większa część literatury bardziej skłania się do rozwiązania drugiego, gdzie domyślnym zachowaniem metod dodajUrzadzenie() i usunUrzadzenie() jest zrzucenie wyjątku, a metody te są odpowiednio przesłaniane w klasie kompozytu.

Istnieje także rozwiązanie polegające na dodaniu prostej metody zwrocKompozyt() pozwalającej wykonać test (zwracanie niezerowego wskaźnika) czy bieżący element jest kompozytem. Oczywiście analogicznym, choć mniej przyjaznym rozwiązaniem jest każdorazowe stosowanie dynamic_cast<HostUSB *>. W oby przypadkach rezygnujemy z nierozróżniania kompozytów i liści.

Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11