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
HacerSonido
que es virtual, lo que permite que las subclases lo sobreescriban. - Una propiedad
Nombre
para acceder al nombre del animal.
-
Definición de la Clase Derivada
TPerro
:- Hereda de
TAnimal
. - Sobrescribe el método
HacerSonido
para 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
,TPerro
yTGato
:TAnimal
tiene un método virtualHacerSonido
.TPerro
yTGato
sobrescribenHacerSonido
para proporcionar implementaciones específicas.
-
Uso del Polimorfismo:
- La función
HacerSonidoAnimal
acepta un parámetro de tipoTAnimal
. - Se llama a
HacerSonido
en instancias deTPerro
yTGato
, 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
TVehiculo
con un método virtualMover
. - Crear clases derivadas
TCoche
yTBicicleta
que sobrescriban el métodoMover
. - Crear instancias de
TCoche
yTBicicleta
y 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
TMotocicleta
que sobrescriba el métodoMover
. - Crear una instancia de
TMotocicleta
y 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