Récapitulatif de is et as

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 EInvalidCast en 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 X n’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 is pour 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)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *