Mam drobny problem przy poprawianiu kodu. Przepisuje go na nowszy model, ale nie potrafię się uporać z jednym problemem. Jako, że opisywanie tego i wklejanie kawałków kodu stałoby się bardzo nieczytelne przedstawię to jako prosty model.
I teraz.
Files<T> jak przedstawione jest bazową dla dwóch innych kolekcji. Dodatkowo wewnątrz klasy zawiera listę generyczną:
- Kod: Zaznacz cały
List<T> items;
I kilka(naście) metod, które są stosowane zarówno dla klasy bazowej jak i dziedziczących.
I teraz najważniejsze.
Klasa BaseClass zawiera właściwość
- Kod: Zaznacz cały
public Files<BaseClass.BRecord> Files {get; set;}
Problem jest w sumie bardzo prosty. W klasach dziedziczących powinno być
- Kod: Zaznacz cały
public D1Files Files {get; set;}
Problem próbowałem rozwiązać na wiele sposobów. Na początku, jako, że nie mogłem tego pogodzić w klasie bazowej było BaseFiles a w pochodnych Files. To jest złe rozwiązanie bo tylko dubluje niepotrzebne dane. Próbowałem przysłaniania ("new"), ale to powoduje wiele błędów gdy przez przypadek można się odwołać do klasy bazowej (niektóre funkcje działają na klasach bazowych, jeśli wewnątrz niej nie wykona się rzutowania na klasę dziedziczącą spowoduje to różne problemy - trudne do wykrycia). Poza tym, komplikacje wynikają również przy serializacji.
Próbowałem również implementacji Files jako pustej abstrakcyjnej klasy bazowej, tzn. wszystkie klasy - Files<BRecord>, D1Files, D2Files miały jako bazową klasę abstrakcyjną "Files". To działa do pewnego stopnia - technicznie jest poprawnie, ale każde odwołanie do takiej właściwości wymaga rzutowania na odpowiedni typ - raczej odpada.
Co chcę osiągnąć ? Najlepiej by było gdyby bazowa klasa abstrakcyjna Files zawierała wszystkie metody operujące na T : BRecord, ale to wymagało stworzenia jej jako generycznej:
- Kod: Zaznacz cały
public abstract class Files<T> where T : BaseClass.BRecord
{
private List<T> items;
public T Get()
{
return items[0];
}
}
O ile same metody można w ten sposób dodać przekazując typ przez T to stworzenie listy wymaga przekazania T już przez klasę, co uniemożliwia jej użycie jako bazowej w BaseClass i dziedziczenie w Derived1 i Derived2 z wykorzystanie typów Derived1.D1Record i Derived2.D2Record.
Jak coś przedstawiłem niejasno to pisać, mogłem o czymś zapomnieć.
Może rozwiązanie problemu jest bardzo proste, wszystko piszę sam, więc mogę mieć jakąś lukę w wiedzy lub zwyczajnie nie wpaść na pewien tok myślenia. W końcu co dwie głowy to nie jedna, więc proszę o pomoc.
Ah, zapomniałem o najważniejszym. Język to C#, choć to nie ma większego znaczenia, bo chodzi jedynie o teoretycznie rozwiązanie problemu, implementację pozostawię sobie