2011-07-10 20 views
6

Duplicar posibles:
Difference between Covariance & Contra-variance.NET: Covarianza y contravarianza

Estoy tratando de comprender lo que es la covarianza y contravarianza, así como la diferencia entre los dos. He consultado this link, y hasta ahora he entendido lo siguiente:

Covarianza es el proceso mediante el cual se asigna un miembro derivado a un miembro base. Tales como:

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

Ni siquiera estoy seguro de si estoy en lo cierto ... supongo. Básicamente, estoy buscando a alguien que me deje boquiabierto, en el más simple de los términos, para que pueda entender cuáles son los dos y las diferencias entre ellos.

También entiendo que hay temas similares de discusión con respecto a esto, pero la mayoría de las respuestas no son el tipo de descripción que estaba buscando.

Respuesta

0

Para nuestros entrenamientos internos he trabajado con el maravilloso libro "Smalltalk, Objetos y Diseño (Chamond Liu)" y reformulé los siguientes ejemplos. - Espero que esto ayude ...

¿Qué significa "consistencia"? La idea es diseñar jerarquías tipo seguro con tipos altamente sustituibles. La clave para obtener esta coherencia es la conformidad basada en subtipo. (vamos a discutir el principio de sustitución de liskov (LSP) en un alto nivel aquí.)

covarianza: Asumamos Las aves que ponen huevos “consistente” con tipos estáticos: si el ave tipo pone un huevo, wouldn 't subtipo de pájaro se encuentra un subtipo de huevo? P. ej. el tipo Duck pone un DuckEgg, luego se da la consistencia. ¿Por qué es esto consistente? Porque en tal expresión: Egg anEgg = aBird.Lay(); la referencia aBird podría ser legalmente sustituida por una instancia de Bird o por una instancia de Duck. Decimos que el tipo de devolución es covariante al tipo, en el que se define Lay(). La anulación de un subtipo puede devolver un tipo más especializado. =>

contravarianza “Entregan más.”: Supongamos pianos que Pianistas puede jugar “consistente” con tipos estáticos: Si un pianista toca el piano, ¿sería capaz de jugar un GrandPiano? ¿No preferiría un Virtuoso jugar un GrandPiano? (¡Cuidado, hay un giro!) ¡Esto es inconsistente! Porque en tal expresión: aPiano.Play(aPianist); ¡no se puede sustituir un piano por un piano o por una instancia de GrandPiano! ¡Un Virtuoso solo puede jugar un GrandPiano, los Pianistas son demasiado generales! Los GrandPianos deben poder reproducirse por tipos más generales, luego la jugada es consistente. Decimos que el tipo de parámetro es contravariante al tipo, en el que se define Play(). La anulación de un subtipo puede aceptar un tipo más generalizado. => "Requieren menos."

Cuestiones relacionadas