Mam dwie klasy (jedna dziedziczy po drugiej). Następnie wczytuje elementy na jedną i na drugą listę klas. W jaki połączyć te listy?
Koood.
Jeżeli lista jest zdefiniowana w klasie bazowej, to w dziedziczącej zwyczajnie możesz dodawać prosto do niej.
Rev napisał(a):
Jeżeli lista jest zdefiniowana w klasie bazowej, to w dziedziczącej zwyczajnie możesz dodawać prosto do niej.
Klasa bazowa X pobiera elementy z pliku i zwraca listę klas typu X. Natomiast klasa pochodna Y pobiera elementy z pliku i zwraca listę klas typu Y.
Później to wywołuje
X obiekt1 = new X();
Y obiekt2 = new Y();
List<X> lista_x = obiekt1.pobierz();
List<Y> lista_y = obiekt2.pobierz();
lista_x.AddRange(obiekt2.pobierz());
Trzeba wspomnieć o jednej rzeczy - dlaczego to właściwie działa. Metoda List<T>.AddRange()
przyjmuje argument IEnumerable<T>
, czyli w tym przypadku IEnumerable<X>
, bo takiego typu jest parametr generyczny naszej listy. A my dajemy mu List<Y>
, czyli IEnumerable<Y>
. A mimo wszystko kod się kompiluje. Otóż zadziała to tylko w przypadku .NET Framework 4. Dlaczego?
Przed .NET 4.0 powyższy interfejs definiowany jest jako IEnumerable<T>
, a od .NET 4.0 jako IEnumerable<out T>
. Słówko out przed parametrem powoduje, że mamy do czynienia z kowariancją. Po więcej odsyłam do MSDN i wyszukiwarki :).
Jeżeli nie możesz skorzystać z .NET 4.0 to elementy musisz dodać pojedynczo, zrób foreach
po obiekt2.pobierz()
i dodaj każdy z elementów przez zwykłe lista_x.Add()