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
Xno 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
ispara 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)