Wiem, że tytuł jest bardzo szeroki - obejmuje wiele!Generics, Polimorfizm, interfejsy: jakie jest rozwiązanie?
Mam nadzieję, że to pytanie może ewoluować do większej "informacji na wiki" na tematy.
Czego nauczyłem - do tej pory:
- Przy korzystaniu Generics - zrozumieć koncepcje (covariance and contravariance).
- Do NOT "mis-use" Pojęcie generyków w połączeniu z dziedziczeniem. Zrobiłem to i może to doprowadzić cię bezpośrednio do problemów związanych z kowariancją! Upewnij się, że "zerwałeś" rodzajowy we właściwym punkcie twojego dziedziczenia - jeśli łączysz te dwa.
(proszę mnie poprawić, - jeżeli uważasz, że się mylę, czy nie brakuje niczego źle).
Moim problemem było:
Ale teraz mam spędzić wiele godzin, próbując dowiedzieć się, jak rozwiązać ten „wielki puzzle” mam na moim biurku. Otrzymałem już kilka dobrych odpowiedzi od kilku z Was, ale teraz nadszedł czas, aby coś działało na większą skalę.
ośmieliłem się rodzajowych z tym jednym: Generics and Polymorphism working together
a teraz jestem trochę zakleszczony na ten jeden: Situations where Generics won't work
Dlaczego ja skończyć z problemami kowariancji - to z powodu mojej klasy w procedurze moja hierarchia.
Zastanawiam się, czy interfejsy to mój kolejny odważny ruch w tej "sadze". Jak można "przekroczyć" problem z kowariancją. Jedną z rzeczy jest dowiedzieć się, że faktycznie masz ten problem - inną rzeczą jest "jak obejść to".
Jeśli więc ktokolwiek z was, dobrych ludzi "tam", ma jakiekolwiek zdanie na ten temat - jestem uszy. Zasadniczo: Poinformuj mnie, żebym poszedł na Interfejsy (ja sam nigdy nie robiłem od zera). Albo .. rzuć mi kość w kierunku, który sugerujesz.
Moja obecna pula źródłowa jest taka, jak podano w drugim linku - od góry.
Oto mały fragment z mojego wcześniejszego post, który pokazuje mój problem z kowariancją. David uprzejmie wyjaśnione - Dlaczego wpadłem w krzak .. Ale teraz potrzebuję informacji na - Jak biegać.
var
aList : TBaseList<TBaseObject>; // used as a list parameter for methods
aPersonList : TPersonList<TPerson>;
aCustomerList : TCustomerList<TCustomer>;
begin
aPersonList := TPersonList<TPerson>.Create;
aCustomerList := TCustomerList<TCustomer>.Create;
aList := aCustomerList; <-- this FAILS !! types not equal ..
end;
Pozdrowienia
Pomogłoby to, gdybyśmy wiedzieli, jaki jest twój rzeczywisty problem. Z mojego doświadczenia wynika, że kowariancja rzadko stanowi problem, jeśli projekt nie jest zbyt złożony. IOW, powiedz nam prawdziwy problem, więc mamy coś konkretnego do rozwiązania. –
@RudyVelthuis Cóż ... jak wspomniałeś - jest to bardzo złożone i wymagałoby wiele przeróbek z byłego [post] (http://stackoverflow.com/q/9140485/696574). Ale w zasadzie jest to ten sam problem - zmieniło się tylko pytanie. Ponieważ teraz wiem, co zrobiłem źle - mam tylko nadzieję, że ktoś może wskazać mi kierunek rozwiązania. Jeśli nadal jest niejasna - daj mi znać, a ja postaram się wyjaśnić tak dobrze jak potrafię. –
Sposób obejścia problemu zależy od problemu * *. Po przypisaniu wartości do 'aList', co oczekiwałeś * zrobienia * tej zmiennej? (Ponadto, dlaczego TPersonList i TCustomerList są generyczne? Jakiego * innego * możesz mieć listę TPersonList?) –