Proszę o radę przy projektowaniu gierki. SzucznaInteligencja potrzebuje kilka interfejsów do sterowania Potworem. Potwór może być Chodzący (posiada metody idźWLewo, idźWPrawo), Skaczący (posiada metodę podskocz), itd. Tych typów może być więcej i mogą być one mieszane. Np. może być Potwór który tylko skacze, lub taki który zarówno skacze jak i chodzi.
Teraz załóżmy, że pewna SzucznaInteligencja potrzebuje interfejsów A i B do poprawnego sterowania Potworem. Ten konkretny Potwór -- szkielet -- implementuje interfejsy A, B i C, także SztucznaInteligencja powinna dać radę nim sterować. Pytanie jakie się teraz nasuwa, to w jaki sposób przekazywać Potwora do SztucznejInteligencji?
Niemożliwe jest wywołanie:
sztucznaInteligencja.steruj(szkielet);
Bo jaki powinien być wtedy typ argumentu tej funkcji?
Można by napisać, że funkcja steruj przyjmuje obiekty nowego typu AB, dziedziczącego po wspomnianych A oraz B. Jednak nadal szkieleta nie można by tam przekazać, trzeba by w nim jeszcze ten nowy interfejs AB zaimplementować, a żeby uzyskać porządnie się zachowującą klasę o interfejsach A, B, C trzeba by zaimplementować wszystkie permutacje tych interfejsów AB, AC, BC, ABC -- raczej słabe rozwiązanie.
Można by umożliwić SztucznejInteligencji przekazywanie tych interfejsów osobno:
void SztucznaInteligencja::steruj(
Chodzacy & chodzacy,
Skaczacy & skaczacy,
JeszczeJakis & jeszczeJakis
);
Jednak to prowadzi do nieeleganckiego wywołania:
sztucznaInteligencja.steruj(
szkielet,
szkielet,
szkielet
);
I nie zapobiega przekazaniu interfejsów różnych obiektów np. do dwóch pierwszych szkieleta1, a do trzeciego szkieleta2.
Offtop: Pytanie dałem do kategorii C++, bo nie znalazłem kategorii "Architektura", "OOP" itp.