2008-11-07 15 views
5

¿Cuál es el significado de los conceptos 'covarianza' y 'contravarianza'?Covarianza frente a contravarianza con respecto a la herencia de clase

Teniendo en 2 clases, animales y elefante (que hereda de Animal), mi entendimiento es que se podrían obtener unos errores en tiempo de ejecución si intenta poner un elefante en una variedad de animales, y esto sucede porque Elephant es "más grande" (más específico) que Animal. ¿Pero podrías colocar un Animal en una serie de Elefantes, viendo cómo se garantiza que Elephant contiene las propiedades de Animal?

+0

útil: http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx –

+0

[Covarianza vs contravarianza] (http://izlooite.blogspot.com/2011/04/covariance-and-contravariance.html) –

Respuesta

9

lo tienes al revés. Puede agregar un Elefante a una matriz de Animales porque es un Animal, y se garantiza que tiene todos los métodos que un Animal debe tener. No puede agregar una matriz Animal a Elefante porque tiene y no tiene todos los métodos que un Elefante debe tener.

El artículo de Wikipedia sobre covariance and contravariance tiene una buena explicación de esto:

Dentro del sistema de tipo de un lenguaje de programación, un operador de tipos de tipos es covariante si se conserva el orden, ≤, de tipos, que ordena tipos de más específicos a más genéricos; es contravariante si invierte este orden. Si ninguno de estos se aplica, el operador es invariante. Estos términos provienen de la teoría de categorías.

Además, usted dijo que el tipo Elefante era "más grande", y este no es el caso. Tipo Animal es "más grande" en el sentido de que incluye tipos más específicos, como Elefante, Jirafa y León.

+0

Ah, eso tiene sentido, ¿dirías que un elefante es covariante para un animal pero un animal es contravariante para un elefante? – alexmac

+0

Depende de lo que esté haciendo con los tipos. Los métodos de Elephant necesitan devolver el mismo tipo o más angosto que los métodos de Animal (podrían devolver Animal o Elefante, si el método Animal devuelve Animal). Eso se llamaría covariante. –

+0

Pero los parámetros del método de los métodos de Elefante deben ser iguales o más amplios que los métodos de Animal. Esto es contravariancia. –

0

Debe intentar leer las páginas 45-49 de Introducing .NET 4.0 With Visual Studio 2010 que trata de este ejemplo exacto. Incluso tiene algunas buenas fotos de elefantes.

El principal punto a llevar es, para hacer esto

var things = new List<IThing<IContent>> { new ConcreteThing() } 

con:

public class ConcreteThing : IThing<ConcreteContent> 
{ 

} 

necesita el "fuera" en la definición de interfaz, que permiten formas más específicas sean establecer, pero cualquier cosa leída fuera de IThing debe garantizarse como el tipo más general.

public interface IThing<out T> where T : IContent 
{ 
} 
Cuestiones relacionadas