Ponieważ nie wiem, jak nazywany jest mój problem, nie mogę zagwarantować, że nikt ostatnio nie zadał tego samego pytania.O generyce i dziedziczeniu (wybacz mój zły tytuł)
Zauważyłem jednak, że istnieje wiele wątków o podobnym tytule, ale nie wydają się one istotne dla mojego problemu.
Mam niestandardową klasę list, która implementuje generics.
class MyList<T>
{
public void add(T item) // adds an item to the list
{ /* code */ }
public void add(MyList<T> list) // attaches an existing list to the end of the current one
{ /* code */ }
}
Mam też klas:
class Apple : Fruit
i
class Banana : Fruit
Teraz przychodzi odpowiedni kod:
MyList<Fruit> fruitList = new MyList<Fruit>();
// fill fruitList
fruitList.add(new Apple()); // works, of course
fruitList.add(new Banana()); // works as well, of course
MyList<Apple> appleList = new MyList<Apple>();
// fill appleList
fruitList.add(appleList); // doesn't work. Why?
Nawet appleList jest mylist (z Apple) i Apple to Fruit, VisualStudio nie akceptuje t MyList (Of Apple) jako argument, gdy pytamy MyList (Of Fruit).
Jednak gdybym miał zadeklarować listę takiego:
MyList<object> fruitList = new MyList<object>();
Wtedy wszystko znowu działa. Co dokładnie zrobiłem źle?
Odpowiedź byłaby bardzo cenna i dziękuję za poświęcenie czasu na przeczytanie, nawet bez odpowiedzi.
Twojej wiadomości, główne słowa kluczowe dotyczące tego to kowariancja, sprzeczność i niezmienność. Tak, raczej trudno jest znaleźć, kiedy o tym nie wiesz. – delnan
Powinieneś zaimplementować 'IList'. –
SLaks
Publiczne nazwy członków w .Net powinny być UpperCamelCase. – SLaks