Pascal/FPC opérateur is pour vérifier le type, as pour cast sécurisé, TClass(X) pour cast brut sans contrôle
Utilisation de is et as
1 Opérateur is : détection de type à l’exécution
Vérifie si une instance d’objet appartient à une classe spécifiée ou à ses sous-classes, renvoie une valeur booléenne True/False, utilisé pour une vérification préalable sécurisée.
2 Opérateur as : conversion de type sécurisée
Upcast / downcast basé sur une validation de type à l’exécution ; lève une exception directement en cas de type incompatible, la sécurité est prioritaire.
3 TMyClass(X) cast brut sans contrôle (unchecked typecast)
Aucune vérification à l’exécution, réinterprète directement la mémoire de force ; plus rapide, mais entraîne un comportement indéfini (plantage, appel de méthode invalide, erreur mémoire) si les types ne correspondent pas. À utiliser uniquement après avoir vérifié le type avec is.
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses
SysUtils;
type
// Classe de base
TFather = class
procedure FatherMethod;
end;
// Classe dérivée héritant 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 référence de classe de base
begin
Son := TSon.Create;
try
// L'instance de classe dérivée peut appeler toutes les méthodes directement
Son.FatherMethod;
Son.SonMethod;
// Upcast : affecter une classe dérivée à une référence de classe de base, syntaxiquement valide
C := Son;
C.FatherMethod; // La référence de base peut appeler ses propres méthodes
// C.SonMethod; // Erreur de compilation : TFather ne possède pas cette méthode
// 1. Vérification de type is + cast sécurisé as
if C is TSon then
(C as TSon).SonMethod;
finally
FreeAndNil(Son);
end;
end.Langage du code : JavaScript (javascript)
Résultat d’exécution
FatherMethod
SonMethod
FatherMethod
SonMethod

C est initialement une référence de type TFather C: TFather;, mais pointe vers l’objet C := Son;. Une sous-classe peut appeler les méthodes de la classe mère via C.FatherMethod;,
Pour appeler les méthodes spécifiques de la sous-classe (C as TSon).SonMethod; , il faut d’abord effectuer une vérification is if C is TSon then pour éviter les erreurs d’exécution.
Comparaison des conversions as et TFather(X)
1. X as TFather
Conversion sécurisée, recommandée pour les cas généraux
- Effectue une vérification de type à l’exécution en arrière-plan, équivaut à exécuter implicitement
X is TMyClass; - Lève une exception
EInvalidCasten cas de type incompatible, l’application peut intercepter l’erreur ; - Légère surcharge de performance, négligeable pour la plupart des codes métier.
2. TFather(X) cast de type forcé brut
Cast sans contrôle, réservé aux scénarios haute performance, interprète la mémoire de force sans vérification.
- Ignore complètement la vérification de type à l’exécution, interprète directement le pointeur d’objet ;
- Légèrement plus rapide ;
- Risques : si
Xn’est pas une instance de la classe cible, les appels de méthode causent des dépassements mémoire, plantage de pile, exceptions aléatoires (comportement indéfini) ; - Autorisé uniquement après une vérification préalable avec
ispour garantir la correspondance des types :
// Méthode sûre 1 : cast as (usage général)
if A is TFather then
(A as TFather).CallSomeMethodOfFather;
// Méthode sûre 2 : cast brut forcé (performance maximale, vérification is faite avant)
if A is TFather then
TMyClass(A).CallSomeMethodOfMyClass;Langage du code : JavaScript (javascript)