Cześć, potrzebuję mieć coś jak kompozyt. Wiem, że nie jest to idealny wzorzec, ale nie udało mi się wymyślić niczego lepszego.
Mamy klasę Item. Klasa Item zawiera kolekcję innych Itemów - typowy kompozyt.
Załóżmy, że dziedziczenie wygląda tak:
class Item {}
class MyItem: Item {}
class SuperItem: MyItem {}
class ExtraItem: Item {}
I teraz chciałbym, żeby klasa MyItem mogła mieć kolekcję klas MyItem, a nie Item. To można by załatwić klasami generycznymi. Ale chciałbym też, żeby klasa SuperItem mogła mieć kolekcję jedynie klas ExtraItem.
I tu poległem. Więc zrobiłem coś bardzo prostego. Zaimplementowałem taki mechanizm, który sprawdza, czy można do obiektu dodać konkretny obiekt - coś w stylu:
protected override bool CanAddObject(Item item)
{
return item.GetType() == typeof(ExtraItem);
}
(to dla klasy SuperItem)
Jeśli ta metoda zwraca false, aplikacja po prostu rzuca asserta i się wywala.
Czy takie rozwiązanie jest do przyjęcia? Jeśli nie, to co w zamian?
Od razu uprzedzam uwagi, które się pojawią: "Źle projektujesz system od początku". Potrzebuję, żeby wszystkie itemy dziedziczyły po jednej klasie: Item. I chcę mieć poukładaną taką strukturę:
Dokument (zawiera Itemy) -> Okres (może zawierać inne okresy i arkusze) -> Arkusz (dziedziczy po okresie, po prostu rozszerza jego funkcjonalność, może posiadać grupy) -> Grupy (mogą posiadać kategorie) -> Kategorie... itd :)
Jak widać bez sensu jest, żeby Grupy zawierały arkusze. Ale może to po prostu ograniczenie kompozytu i nie wymyślono niczego lepszego.