Herencia y métodos virtuales

Herencia, métodos virtuales, override, reintroduce

Ejemplo de herencia de clases

Object Pascal admite la herencia y los métodos virtuales. En el siguiente ejemplo, TDog hereda de TAnimal:

TDog es la subclase (clase derivada) y TAnimal es la superclase (clase padre)

program AnimalDemo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;

type
  // Superclase de animales
  TAnimal = class
    procedure Cry; virtual; // Método virtual: sonido del animal
  end; // Fin de definición de clase, solo end;

  // Subclase Perro, hereda Animal y sobrescribe el sonido
  TDog = class(TAnimal)
    procedure Cry; override;
  end;

procedure TAnimal.Cry;
begin
  WriteLn('El animal emite un sonido');
end;

procedure TDog.Cry;
begin
  WriteLn('Guau guau guau');
end;

var
  Pet: TAnimal;
begin
  // Instancia de la superclase
  Pet := TAnimal.Create;
  try
    Pet.Cry;
  finally
    FreeAndNil(Pet);
  end;

  // Instancia de subclase almacenada en variable de superclase, se activa el polimorfismo
  Pet := TDog.Create;
  try
    Pet.Cry;
  finally
    FreeAndNil(Pet);
  end;
end.Lenguaje del código: JavaScript (javascript)

Resultado de ejecución

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
45 lines compiled, 0.1 sec, 68544 bytes code, 4260 bytes data

D:\fpcdemo>mydemo
El animal emite un sonido
Guau guau guauLenguaje del código: CSS (css)

FreeAndNil

Liberación segura de objetos, une dos pasos en uno:

  1. Llamar al método Free del objeto para liberar memoria;
  2. Asignar nil a la variable para evitar punteros colgantes.

El código anterior guarda un objeto de la subclase TDog dentro de una variable de tipo TAnimal llamada Pet. Al invocar Cry a través de Pet, se ejecuta el método Cry de TDog y no el de TAnimal, esto es el polimorfismo.

  • Cry; virtual marca el método padre como virtual y habilita el polimorfismo en tiempo de ejecución;
  • La subclase sobrescribe Cry con el modificador override;
  • La variable se declara como TAnimal pero almacena un objeto real TDog, ejecutando automáticamente el ladrido del perro.

Para los métodos marcados con virtual: el compilador busca la implementación correspondiente en tiempo de ejecución según el tipo real del objeto.

Si eliminas virtual y override

Ambas llamadas ejecutarán el método de la clase padre

La imagen superior muestra el resultado tras borrar virtual y override

Toda la salida procede de la implementación de TAnimal

El compilador solo reconoce el tipo declarado de la variable TMyClass e ignora el tipo real del objeto en ejecución.

  • Los métodos normales no son virtuales por defecto, solo al agregar virtual pasan a ser virtuales;
  • Es obligatorio usar override al sobrescribir un método virtual heredado en la subclase, si no el compilador emitirá una advertencia;
  • Si quieres ocultar un método virtual homónimo de la clase padre sin sobrescribirlo usa reintroduce (no recomendado, genera confusión), equivale a la palabra reservada new en C#

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *