Introducción

En este módulo, exploraremos el uso de genéricos y colecciones en Delphi. Los genéricos permiten crear clases, procedimientos y funciones que operan con cualquier tipo de datos, proporcionando una mayor flexibilidad y reutilización del código. Las colecciones, por otro lado, son estructuras de datos que permiten almacenar y manipular conjuntos de elementos de manera eficiente.

Conceptos Clave

  1. Genéricos:

    • Definición y uso de genéricos.
    • Ventajas de los genéricos.
    • Sintaxis de genéricos en Delphi.
  2. Colecciones:

    • Tipos de colecciones en Delphi.
    • Uso de listas, colas, pilas y diccionarios.
    • Operaciones comunes en colecciones.

Genéricos en Delphi

Definición y Uso de Genéricos

Los genéricos permiten definir clases, procedimientos y funciones que no están limitados a un tipo de datos específico. En lugar de especificar un tipo de datos concreto, se utiliza un parámetro de tipo que se sustituye por el tipo real cuando se instancia el genérico.

Ventajas de los Genéricos

  • Reutilización del Código: Los genéricos permiten escribir código que puede trabajar con cualquier tipo de datos, lo que reduce la duplicación de código.
  • Seguridad de Tipos: Al utilizar genéricos, se puede garantizar que el tipo de datos utilizado es consistente, lo que reduce los errores de tipo en tiempo de ejecución.
  • Flexibilidad: Los genéricos permiten crear estructuras de datos y algoritmos que pueden adaptarse a diferentes tipos de datos sin necesidad de modificar el código.

Sintaxis de Genéricos en Delphi

Definición de una Clase Genérica

type
  TMiClaseGenérica<T> = class
  private
    FValor: T;
  public
    constructor Create(AValor: T);
    function ObtenerValor: T;
  end;

constructor TMiClaseGenérica<T>.Create(AValor: T);
begin
  FValor := AValor;
end;

function TMiClaseGenérica<T>.ObtenerValor: T;
begin
  Result := FValor;
end;

Uso de una Clase Genérica

var
  EnteroGenérico: TMiClaseGenérica<Integer>;
  CadenaGenérica: TMiClaseGenérica<string>;
begin
  EnteroGenérico := TMiClaseGenérica<Integer>.Create(10);
  CadenaGenérica := TMiClaseGenérica<string>.Create('Hola');
  
  WriteLn(EnteroGenérico.ObtenerValor); // Salida: 10
  WriteLn(CadenaGenérica.ObtenerValor); // Salida: Hola
end;

Colecciones en Delphi

Tipos de Colecciones

Delphi proporciona varias colecciones genéricas en la unidad System.Generics.Collections, incluyendo:

  • TList: Lista genérica.
  • TQueue: Cola genérica.
  • TStack: Pila genérica.
  • TDictionary<TKey, TValue>: Diccionario genérico.

Uso de Listas

Definición y Operaciones Básicas

uses
  System.Generics.Collections;

var
  ListaEnteros: TList<Integer>;
begin
  ListaEnteros := TList<Integer>.Create;
  try
    // Añadir elementos
    ListaEnteros.Add(1);
    ListaEnteros.Add(2);
    ListaEnteros.Add(3);

    // Acceder a elementos
    WriteLn(ListaEnteros[0]); // Salida: 1

    // Eliminar elementos
    ListaEnteros.Delete(0);

    // Recorrer la lista
    for var i in ListaEnteros do
      WriteLn(i); // Salida: 2, 3
  finally
    ListaEnteros.Free;
  end;
end;

Uso de Diccionarios

Definición y Operaciones Básicas

uses
  System.Generics.Collections;

var
  Diccionario: TDictionary<string, Integer>;
begin
  Diccionario := TDictionary<string, Integer>.Create;
  try
    // Añadir pares clave-valor
    Diccionario.Add('Uno', 1);
    Diccionario.Add('Dos', 2);

    // Acceder a valores
    WriteLn(Diccionario['Uno']); // Salida: 1

    // Comprobar si una clave existe
    if Diccionario.ContainsKey('Dos') then
      WriteLn('Clave "Dos" encontrada.');

    // Recorrer el diccionario
    for var Par in Diccionario do
      WriteLn(Par.Key, ': ', Par.Value); // Salida: Uno: 1, Dos: 2
  finally
    Diccionario.Free;
  end;
end;

Ejercicios Prácticos

Ejercicio 1: Crear una Lista Genérica

Instrucciones:

  1. Define una lista genérica de tipo TList<string>.
  2. Añade tres nombres a la lista.
  3. Imprime todos los nombres en la lista.

Solución:

uses
  System.Generics.Collections;

var
  ListaNombres: TList<string>;
begin
  ListaNombres := TList<string>.Create;
  try
    ListaNombres.Add('Ana');
    ListaNombres.Add('Luis');
    ListaNombres.Add('Carlos');

    for var Nombre in ListaNombres do
      WriteLn(Nombre); // Salida: Ana, Luis, Carlos
  finally
    ListaNombres.Free;
  end;
end;

Ejercicio 2: Crear un Diccionario Genérico

Instrucciones:

  1. Define un diccionario genérico de tipo TDictionary<string, Integer>.
  2. Añade tres pares clave-valor al diccionario.
  3. Imprime todas las claves y valores en el diccionario.

Solución:

uses
  System.Generics.Collections;

var
  DiccionarioEdades: TDictionary<string, Integer>;
begin
  DiccionarioEdades := TDictionary<string, Integer>.Create;
  try
    DiccionarioEdades.Add('Ana', 25);
    DiccionarioEdades.Add('Luis', 30);
    DiccionarioEdades.Add('Carlos', 28);

    for var Par in DiccionarioEdades do
      WriteLn(Par.Key, ': ', Par.Value); // Salida: Ana: 25, Luis: 30, Carlos: 28
  finally
    DiccionarioEdades.Free;
  end;
end;

Conclusión

En este módulo, hemos aprendido sobre los genéricos y las colecciones en Delphi. Los genéricos nos permiten crear código más flexible y reutilizable, mientras que las colecciones nos proporcionan estructuras de datos eficientes para almacenar y manipular conjuntos de elementos. Con estos conocimientos, estamos mejor preparados para escribir código más robusto y eficiente en Delphi.

En el próximo módulo, exploraremos el multihilo y la programación paralela, lo que nos permitirá crear aplicaciones más rápidas y responsivas.

Curso de Programación en Delphi/Object Pascal

Módulo 1: Introducción a Delphi/Object Pascal

Módulo 2: Estructuras de Control y Procedimientos

Módulo 3: Trabajando con Datos

Módulo 4: Programación Orientada a Objetos

Módulo 5: Características Avanzadas de Delphi

Módulo 6: Desarrollo de GUI con VCL y FMX

Módulo 7: Desarrollo Web y Móvil

Módulo 8: Mejores Prácticas y Patrones de Diseño

Módulo 9: Proyecto Final

© Copyright 2024. Todos los derechos reservados