Introducción
En este tema, exploraremos dos conceptos fundamentales de la Programación Orientada a Objetos (POO): la herencia y el polimorfismo. Estos conceptos permiten crear estructuras de código más reutilizables y flexibles, facilitando la extensión y el mantenimiento de las aplicaciones.
Herencia
La herencia es un mecanismo que permite crear una nueva clase a partir de una clase existente. La nueva clase, llamada clase derivada o subclase, hereda los atributos y métodos de la clase base o superclase. Esto permite reutilizar el código y extender la funcionalidad de las clases existentes.
Conceptos Clave
- Clase Base (Superclase): La clase original de la cual se derivan otras clases.
- Clase Derivada (Subclase): La nueva clase que hereda de la clase base.
- Herencia Simple: Una clase derivada hereda de una sola clase base.
- Herencia Múltiple: No es soportada directamente en Delphi, pero se puede simular usando interfaces.
Ejemplo Práctico
program HerenciaEjemplo;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
// Definición de la clase base
TAnimal = class
private
FNombre: string;
public
constructor Create(Nombre: string);
procedure HacerSonido; virtual;
property Nombre: string read FNombre write FNombre;
end;
// Definición de la clase derivada
TPerro = class(TAnimal)
public
procedure HacerSonido; override;
end;
constructor TAnimal.Create(Nombre: string);
begin
FNombre := Nombre;
end;
procedure TAnimal.HacerSonido;
begin
Writeln('El animal hace un sonido.');
end;
procedure TPerro.HacerSonido;
begin
Writeln('El perro ladra.');
end;
var
MiPerro: TPerro;
begin
MiPerro := TPerro.Create('Fido');
try
Writeln('Nombre del perro: ', MiPerro.Nombre);
MiPerro.HacerSonido;
finally
MiPerro.Free;
end;
end.Explicación del Código
-
Definición de la Clase Base
TAnimal:- Tiene un constructor que inicializa el nombre del animal.
- Un método
HacerSonidoque es virtual, lo que permite que las subclases lo sobreescriban. - Una propiedad
Nombrepara acceder al nombre del animal.
-
Definición de la Clase Derivada
TPerro:- Hereda de
TAnimal. - Sobrescribe el método
HacerSonidopara proporcionar una implementación específica para perros.
- Hereda de
-
Uso de las Clases:
- Se crea una instancia de
TPerro, se establece su nombre y se llama al métodoHacerSonido.
- Se crea una instancia de
Polimorfismo
El polimorfismo permite que una clase derivada sea tratada como una instancia de su clase base. Esto permite que el mismo código funcione con diferentes tipos de objetos, proporcionando flexibilidad y extensibilidad.
Conceptos Clave
- Polimorfismo en Tiempo de Ejecución: Se logra mediante métodos virtuales y sobrescritos.
- Polimorfismo en Tiempo de Compilación: Se logra mediante sobrecarga de métodos (no cubierto en este tema).
Ejemplo Práctico
program PolimorfismoEjemplo;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TAnimal = class
public
procedure HacerSonido; virtual;
end;
TPerro = class(TAnimal)
public
procedure HacerSonido; override;
end;
TGato = class(TAnimal)
public
procedure HacerSonido; override;
end;
procedure TAnimal.HacerSonido;
begin
Writeln('El animal hace un sonido.');
end;
procedure TPerro.HacerSonido;
begin
Writeln('El perro ladra.');
end;
procedure TGato.HacerSonido;
begin
Writeln('El gato maúlla.');
end;
procedure HacerSonidoAnimal(Animal: TAnimal);
begin
Animal.HacerSonido;
end;
var
MiPerro: TPerro;
MiGato: TGato;
begin
MiPerro := TPerro.Create;
MiGato := TGato.Create;
try
HacerSonidoAnimal(MiPerro);
HacerSonidoAnimal(MiGato);
finally
MiPerro.Free;
MiGato.Free;
end;
end.Explicación del Código
-
Definición de Clases
TAnimal,TPerroyTGato:TAnimaltiene un método virtualHacerSonido.TPerroyTGatosobrescribenHacerSonidopara proporcionar implementaciones específicas.
-
Uso del Polimorfismo:
- La función
HacerSonidoAnimalacepta un parámetro de tipoTAnimal. - Se llama a
HacerSonidoen instancias deTPerroyTGato, demostrando el polimorfismo en tiempo de ejecución.
- La función
Ejercicios Prácticos
Ejercicio 1: Crear una Jerarquía de Clases
- Objetivo: Crear una jerarquía de clases para diferentes tipos de vehículos.
- Instrucciones:
- Crear una clase base
TVehiculocon un método virtualMover. - Crear clases derivadas
TCocheyTBicicletaque sobrescriban el métodoMover. - Crear instancias de
TCocheyTBicicletay demostrar el polimorfismo.
- Crear una clase base
Solución
program VehiculosEjemplo;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TVehiculo = class
public
procedure Mover; virtual;
end;
TCoche = class(TVehiculo)
public
procedure Mover; override;
end;
TBicicleta = class(TVehiculo)
public
procedure Mover; override;
end;
procedure TVehiculo.Mover;
begin
Writeln('El vehículo se mueve.');
end;
procedure TCoche.Mover;
begin
Writeln('El coche conduce.');
end;
procedure TBicicleta.Mover;
begin
Writeln('La bicicleta pedalea.');
end;
procedure MoverVehiculo(Vehiculo: TVehiculo);
begin
Vehiculo.Mover;
end;
var
MiCoche: TCoche;
MiBicicleta: TBicicleta;
begin
MiCoche := TCoche.Create;
MiBicicleta := TBicicleta.Create;
try
MoverVehiculo(MiCoche);
MoverVehiculo(MiBicicleta);
finally
MiCoche.Free;
MiBicicleta.Free;
end;
end.Ejercicio 2: Añadir Nuevas Clases Derivadas
- Objetivo: Extender la jerarquía de clases de vehículos.
- Instrucciones:
- Añadir una nueva clase derivada
TMotocicletaque sobrescriba el métodoMover. - Crear una instancia de
TMotocicletay demostrar el polimorfismo.
- Añadir una nueva clase derivada
Solución
program VehiculosExtendidoEjemplo;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TVehiculo = class
public
procedure Mover; virtual;
end;
TCoche = class(TVehiculo)
public
procedure Mover; override;
end;
TBicicleta = class(TVehiculo)
public
procedure Mover; override;
end;
TMotocicleta = class(TVehiculo)
public
procedure Mover; override;
end;
procedure TVehiculo.Mover;
begin
Writeln('El vehículo se mueve.');
end;
procedure TCoche.Mover;
begin
Writeln('El coche conduce.');
end;
procedure TBicicleta.Mover;
begin
Writeln('La bicicleta pedalea.');
end;
procedure TMotocicleta.Mover;
begin
Writeln('La motocicleta acelera.');
end;
procedure MoverVehiculo(Vehiculo: TVehiculo);
begin
Vehiculo.Mover;
end;
var
MiCoche: TCoche;
MiBicicleta: TBicicleta;
MiMotocicleta: TMotocicleta;
begin
MiCoche := TCoche.Create;
MiBicicleta := TBicicleta.Create;
MiMotocicleta := TMotocicleta.Create;
try
MoverVehiculo(MiCoche);
MoverVehiculo(MiBicicleta);
MoverVehiculo(MiMotocicleta);
finally
MiCoche.Free;
MiBicicleta.Free;
MiMotocicleta.Free;
end;
end.Conclusión
En esta sección, hemos aprendido sobre la herencia y el polimorfismo en Delphi/Object Pascal. La herencia nos permite crear nuevas clases basadas en clases existentes, reutilizando y extendiendo el código. El polimorfismo nos permite tratar objetos de diferentes clases derivadas de manera uniforme, proporcionando flexibilidad y extensibilidad en nuestro código.
En el próximo tema, exploraremos las interfaces y las clases abstractas, que son herramientas adicionales para diseñar sistemas orientados a objetos robustos y flexibles.
Curso de Programación en Delphi/Object Pascal
Módulo 1: Introducción a Delphi/Object Pascal
- Introducción a Delphi y Object Pascal
- Configuración del Entorno de Desarrollo
- Primera Aplicación en Delphi
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
Módulo 2: Estructuras de Control y Procedimientos
- Sentencias Condicionales
- Bucles e Iteración
- Procedimientos y Funciones
- Ámbito y Ciclo de Vida de las Variables
- Manejo de Errores y Depuración
Módulo 3: Trabajando con Datos
- Arreglos y Cadenas
- Registros y Conjuntos
- Tipos Enumerados y Subrangos
- Manejo de Archivos
- Acceso a Bases de Datos
Módulo 4: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Herencia y Polimorfismo
- Interfaces y Clases Abstractas
- Manejo de Excepciones en POO
Módulo 5: Características Avanzadas de Delphi
- Genéricos y Colecciones
- Multihilo y Programación Paralela
- Desarrollo Basado en Componentes
- Biblioteca de Tiempo de Ejecución de Delphi (RTL)
- Técnicas Avanzadas de Depuración
Módulo 6: Desarrollo de GUI con VCL y FMX
- Introducción a VCL
- Creación de Formularios y Controles
- Programación Orientada a Eventos
- Introducción a FireMonkey (FMX)
- Desarrollo Multiplataforma con FMX
Módulo 7: Desarrollo Web y Móvil
- Desarrollo Web con Delphi
- Servicios RESTful
- Desarrollo Móvil con Delphi
- Despliegue de Aplicaciones Móviles
- Integración con Servicios Web
Módulo 8: Mejores Prácticas y Patrones de Diseño
- Organización del Código y Documentación
- Patrones de Diseño en Delphi
- Técnicas de Refactorización
- Pruebas Unitarias y Desarrollo Basado en Pruebas
- Optimización del Rendimiento
