Resumen de is y as

Pascal/FPC operador is comprobación de tipo, as conversión segura, TClass(X) conversión bruta forzada sin comprobaciones

Uso de is y as

1 Operador is: Detección de tipo en tiempo de ejecución

Verifica si una instancia de objeto pertenece a una clase indicada o a sus subclases, retorna un valor booleano True/False y se emplea para comprobaciones previas seguras.

2 Operador as: Conversión de tipo segura

Conversión ascendente / descendente basada en validación de tipo en tiempo de ejecución; si los tipos no coinciden lanza una excepción directamente, prioriza la seguridad.

3 TMyClass(X) conversión bruta forzada (unchecked typecast)

No realiza comprobaciones en tiempo de ejecución, reinterpreta la memoria de forma forzada; es más rápida, pero si los tipos no coinciden produce comportamiento indefinido (crasheos, llamadas a métodos inválidos, errores de memoria). Solo se usa tras confirmar el tipo con is.

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

type
  // Clase base
  TFather = class
    procedure FatherMethod;
  end;

  // Clase derivada que hereda de TFather
  TSon = class(TFather)
    procedure SonMethod;
  end;

procedure TFather.FatherMethod;
begin
  WriteLn('FatherMethod');
end;

procedure TSon.SonMethod;
begin
  WriteLn('SonMethod');
end;

var
  Son: TSon;
  C: TFather; // Variable de referencia de clase base
begin
  Son := TSon.Create;
  try
    // La instancia de la clase derivada puede invocar todos los métodos directamente
    Son.FatherMethod;
    Son.SonMethod;

    // Conversión ascendente: asignar clase derivada a referencia de clase base, sintácticamente válido
    C := Son;
    C.FatherMethod; // La referencia base puede llamar a sus propios métodos

    // C.SonMethod; // Error de compilación: TFather no dispone de este método

    // 1. Comprobación de tipo is + conversión segura as
    if C is TSon then
      (C as TSon).SonMethod;

  finally
    FreeAndNil(Son);
  end;
end.Lenguaje del código: JavaScript (javascript)

Resultado de ejecución

FatherMethod
SonMethod
FatherMethod
SonMethod

C es originalmente una referencia de tipo TFather C: TFather;, pero apunta al objeto C := Son;. Las subclases pueden invocar métodos de la clase padre mediante C.FatherMethod;,

Para llamar a los métodos exclusivos de la subclase (C as TSon).SonMethod; hay que realizar primero una comprobación con is if C is TSon then para evitar errores en tiempo de ejecución.

Comparación entre conversiones as y TFather(X)

1. X as TFather

Conversión segura, recomendada para escenarios generales

  • Ejecuta comprobación de tipo en tiempo de ejecución en segundo plano, equivalente a ejecutar implícitamente X is TMyClass;
  • Si los tipos no coinciden lanza la excepción EInvalidCast, el programa puede capturar el error;
  • Tiene una pequeña sobrecarga de rendimiento, despreciable para la mayoría de código de negocio.

2. TFather(X) conversión forzada bruta

Conversión sin comprobaciones, solo para escenarios de alto rendimiento, interpreta la memoria de forma directa y forzada.

  • Omite totalmente la comprobación de tipo en tiempo de ejecución, interpreta directamente el puntero del objeto de forma forzada;
  • Es ligeramente más rápida;
  • Riesgos: si X no es una instancia de la clase objetivo, las llamadas a métodos provocan desbordamientos de memoria, caídas de pila y excepciones aleatorias (comportamiento indefinido);
  • Solo se permite usar tras una comprobación previa con is para garantizar que los tipos coincidan:
// Forma segura 1: conversión as (uso general)
if A is TFather then
  (A as  TFather).CallSomeMethodOfFather;

// Forma segura 2: conversión bruta forzada (rendimiento máximo, comprobación is previa)
if A is TFather then
  TMyClass(A).CallSomeMethodOfMyClass;Lenguaje del código: JavaScript (javascript)

Deja una respuesta

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