2011-07-10 8 views
6

Powiel możliwe:
Difference between Covariance & Contra-varianceNET: kowariancji i kontrawariancja

Próbuję zrozumieć, co kowariancji i kontrawariancja jest jak różnica między tymi dwoma. Spojrzałem na this link i do tej pory zrozumiałem, co następuje:

Kowariancja to proces, według którego można przypisać element pochodny do elementu podstawowego. Takich jak:

IEnumerable<Derived> d = new List<Derived>(); 
IEnumerable<Base> b = d; 

Nie jestem nawet pewien, czy mam rację w powyższym ... zgaduję. Zasadniczo szukam kogoś, kto by mi o tym pomówił, w najprostszych terminach, abym mógł zrozumieć, czym są ci dwaj i różnice między nimi.

Rozumiem również, że są podobne tematy dyskusji na ten temat, ale większość odpowiedzi nie jest rodzajem opisu, którego szukałem.

Odpowiedz

0

Do naszych wewnętrznych szkoleń pracowałem ze wspaniałą książką "Smalltalk, Objects and Design (Chamond Liu)" i przeformułowałem następujące przykłady. - Mam nadzieję, że to pomoże ...

Co oznacza "konsystencja"? Chodzi o zaprojektowanie hierarchii typu bezpiecznych typów o wysoce zastępowalnych typach. Kluczem do uzyskania tej spójności jest zgodność z podtypem. (będziemy omawiać zasada podstawienia liskov (LSP) na wysokim poziomie tutaj.)

kowariancji: Załóżmy ptaki składają jaja „konsekwentnie” z typowania statycznego: Jeśli typ ptak składa jajko, wouldn Podtyp ptaka to podtyp Jajka? E.g. typ Duck kładzie DuckEgg, a następnie konsystencja jest podana. Dlaczego to jest spójne? Ponieważ w takim wyrażeniu: Egg anEgg = aBird.Lay(); odniesienie aBird może być prawnie zastąpione przez instancję Bird lub Duck. Mówimy, że typ zwracany jest kowariancyjny do typu, w którym zdefiniowano Lay(). Zastąpienie podtypu może zwrócić bardziej wyspecjalizowany typ. =>

kontrawariancja „Oni dostarczają więcej.”: Załóżmy Fortepiany że Pianiści może grać „konsekwentnie” z typowania statycznego: Jeśli pianista gra na fortepianie, będzie mogła odgrywać GrandPiano? Czy raczej Virtuoso nie grałoby na GrandPiano? (Ostrzegajcie, jest pewien zwrot!) Jest to niespójne! Ponieważ w takim wyrażeniu: aPiano.Play(aPianist); aPiano nie może być prawnie zastąpione przez instancję Piano lub GrandPiano! GrandPiano może grać tylko Virtuoso, Pianiści są zbyt ogólni! GrandPianos musi być odtwarzany przez bardziej ogólne typy, a następnie gra jest spójna. Mówimy, że typ parametru jest sprzeczny z typem, w którym zdefiniowano Play(). Nadpisanie podtypu może akceptować bardziej ogólny typ. => "Wymagają mniej."

Powiązane problemy