Вы находитесь на странице: 1из 12

Genericidad

n Genericidad

Puedo meterle cualquier tipo de objeto

Tengo que hacer un cast para recuperarlo tal cual, lo que me puede dar excepcin

cturas Genericas

No hay que hacer cast. El compilador conoce el tipo

El compilador nos protege de no meter un objeto que no sea del tipo

faces y Genericidad

Garantiza que Fecha solo se compare con Fecha

ericidad Restringida

Garantiza que el tipo T tenga que se IComparable Y por tanto este cdigo es estticamente correcto

Buena combinacin con los mtodos extensores

Genericidad e Iteradores un buen maridaje

rrays son genricos


Definiciones de tipos de datos genricas an en lenguajes que no tienen genericidad
string[] nombres = new string[10]; nombres[3] = 100; Error de compilacin Animal
(Come)

Perro[] perros = new Perro[5]; Gato[] gatos = new Gato[4]; ... Excepcin Animal[] animales = perros; Gato Tom = new Gato(); animales[2] = Tom; animales[1].Come(); Qu debe ocurrir?

Perr o
(Ladra)

Gato
(Maulla )

animales[2].Ladra(); No se puede meter un gato en un array que realmente es de perros. Los arrays son covariantes pero no de manera segura

ucturas genricas
C#1. 0 ArrayList a = new ArrayList(); a.Add("rojo"); a.Add("azul"); a.Add("blanco"); a.Add(100);
Posible intruso

string color = (string)a[1];

C#2. 0 List<string> a = new List<string>(); a.Add("rojo"); a.Add("azul"); a.Add("blanco"); a.Add(100); ERROR de COMPILACIN string color = a[1]; No hay que hacer Cast, el compilador sabe que el tipo de a[1] es string

ucturas genricas
C#2. class List<T> { 0 ... Parmetro genrico
genrico Uso del parmetro genrico Uso ... del parmetro public void Add(T x){ }

public void Remove(T x) { ... } public T this[int k] { ... } ... }

Uso del parmetro genrico

List<string> a = new List<string>(); a.Add(100);

Instanciacin genrica, se indica cul ser el tipo T en List<T> para el caso de a

a.Add("rojo"); a.Add("azul"); a.Add("blanco");


El compilador tiene toda la informacin para saber de qu tipo string color = a[1]; debe ser el parmetro de Add o el valor de a[1]

nza y estructuras genricas


Animal
(Come)

C#2. 0 List<Perros> misPerros = new List<misPerros>(); List<Animal> misMascotas = misPerros; Gato Tom = new Gato();
Se permite o no se permite?

Perro
(Ladra )

Gato
(Maull a)

Qu pasara entonces si se misMascotas.Add(Tom);hace?

C#2.0 es MUY restrictivo, esta asignacin Covariante NO se permite (ERROR de Compilacin) Cmo ser menos restrictivo sin perder proteccin?

nza y estructuras genricas


C#4. 0
Se puede hacer IEnumerable<Animal> misAnimales = misPerros porque a travs de un IEnumerable a misAnimales no se le puede hacer ninguna operacin Add La especificacin out indica al compilador que garantice que el parmetro genrico T solo se puede usar en parte izquierda

Por lo tanto no puede haber ninguna operacin sobre un IEnumerable que provoque un cambio en algn T por un descendiente de T

New features in C# 4.0, Mads Torgersen MSDN, video PDC, Object Oriented Software Construction, Bertrand Meyer Covariance and Contravariance in C#, Eric Lippert's Blog

Вам также может понравиться