domingo, octubre 05, 2008

UNA LISTA GENÉRICA

Si nos limitamos al comportamiento común a todos los tipos de datos primitivos posibles, poca cosa podremos hacer con los genéricos, ahora que Delphi 2009 soporta los tipos genéricos se han desarrollado bibliotecas con tipos genéricos para tipos de datos no primitivos tales como TList y TArray entre otros, para poder utilizarlos debemos agregar la unidad Generics.Collections y Generics.Defaults a la clausula uses.
En este post veremos el uso de de la lista genérica TList.
Supongamos que queremos crear una lista con personas representadas por la clase TPersona:



















Ahora declaramos una lista genérica del tipo TPersona:




Y a continuación un método que llene la lista:






Por último vamos a mostrarla en un TListBox:











Como podemos ver, no hay ciencia para el uso de una lista genérica, declaramos una variable de tipo TList y le damos un tipo concreto a T que es TPersona, posteriormente la instanciamos y la llenamos y por último recorremos la lista usando el nuevo for in do.
Ahora vamos a complicar un poco más el ejemplo:
Queremos ordenar la lista por un atributo de la clase persona, vamos a decir por la propiedad Apellidos.Frecuentemente tenemos la necesidad de ordenar las listas de tipo genérico, ya que el tipo genérico puede contener cualquier tipo de objeto la forma en que la lista debe ordenar los elementos la debe proporcionar el programador. Para este fin TObjectList que es la clase de la cual deriva TList proporciona dos métodos sobrecargados:




El primer método se utiliza para designar un procedimiento de ordenación estándar por ejemplo QuickSort.

Si el programador necesita definir su propio tipo de ordenación entonces requiere del uso del segundo método. El segundo método acepta una interfaz del tipo IComparer como parámetro la cual está definida de la siguiente forma:





El método Compare de la interfaz IComparer devuelve un valor entero que debe ser interpretado de la siguiente manera: 0 si son iguales, menor de cero si el primer parámetro (Left) es menor que el segundo (Rigth) o mayor que cero si el primer parámetro (Left) es mayor que el segundo (Rigth), por lo tanto el programador debe de tener en cuenta esta regla a la hora de implementar la interfaz.

En Delphi 2009 se ha definido la siguiente clase que hereda la interfaz ICompare y que es la que utilizaremos para ordenar la lista genérica:







Y TComparison es un delegado que está definido de la siguiente forma:





Sabiendo esto y aplicando nuestros conocimientos anteriores podemos implementar el método Sort utilizando métodos anónimos de la siguiente forma:





Como el método Sort espera un parámetro de tipo IComparer utilizamos el método de clase Construct de la clase TComparer que devuelve una interfaz de este tipo, ahora como el método Construct acepta un parámetro de tipo TComparison y esté está definido como un método anónimo entonces podemos implementar ahí mismo la rutina que devuelva el valor entero (basado en la regla que mencionamos anteriormente) que se necesita para realizar la ordenación. Por último la función CompareText compara dos cadenas y devuelve un valor entero con el resultado de la comparación basada en la regla que mencionamos anteriormente.

Los genéricos son una nueva característica de Delphi 2009. Al igual que en C# se utilizan en gran cantidad de casos, en este contexto el uso de métodos anónimos es grande.
Además de TList Delphi tiene más tipos genéricos incluidos TArray, TEnumerable, TDictionary, TQueue, etc. Por lo que siempre hay más por explorar y explicar pero esto será en los próximos post.

Hasta aquí mi explicación espero que les sea de gran ayuda. Hasta la próxima.

Etiquetas: , ,

0 Comentarios:

Publicar un comentario

Suscribirse a Comentarios de la entrada [Atom]

<< Página Principal

eXTReMe Tracker