Champs (Delphi)

De RAD Studio

Remonter à Classes et objets - Index

Cette rubrique décrit la syntaxe des déclarations de champs de données des classes.

A propos des champs

Un champ est semblable à une variable appartenant à un objet. Les champs peuvent avoir n'importe quel type, y compris les types classe. (Les champs peuvent donc contenir des références d'objets.) Les champs sont généralement privés.

Pour définir un membre champ dans une classe, déclarez simplement le champ comme vous le feriez pour une variable. Par exemple, la déclaration suivante crée une classe appelée TNumber dont le seul membre, en dehors des méthodes héritées de System.TObject, est un champ entier appelé Int :

 type
   TNumber = class
     var
       Int: Integer;
   end;

Le mot-clé var est facultatif. Toutefois, s'il n'est pas utilisé, toutes les déclarations de champs doivent être placées avant les déclarations de propriétés ou de méthodes. Après les déclarations de propriétés ou de méthodes, le mot-clé var peut être utilisé pour introduire des déclarations de champs supplémentaires.

Lorsqu'un objet est créé, ses champs sont initialisés à zéro ou aux valeurs par défaut. Ce comportement est différent de celui des variables locales qui ne sont pas initialisées. Si vous entrez :

var

  N: TNumber;

begin

  N := TNumber.Create;

la valeur de N.Int sera zéro.

Les champs sont liés statiquement, c'est-à-dire que les références les désignant sont réglées à la compilation. Pour comprendre ce que cela signifie, examinez le code suivant :

 type
    TAncestor = class
       Value: Integer;
    end;
 
    TDescendant = class(TAncestor)
       Value: string;    // hides the inherited Value field
    end;
 
 var
    MyObject: TAncestor;
 
 begin
    MyObject := TDescendant.Create;
    MyObject.Value := 'Hello!'     // error
 
   (MyObject as TDescendant).Value := 'Hello!'   // works!
 end;

Même si MyObject contient une instance de TDescendant, il est déclaré comme un TAncestor. Le compilateur interprète donc MyObject.Value comme une référence au champ (entier) déclaré dans TAncestor. Cependant, les deux champs existent dans l'objet TDescendant ; la valeur Value héritée est masquée par la nouvelle, mais il est possible d'y accéder en utilisant un transtypage.

Les déclarations de constantes et de constantes typées peuvent apparaître dans des classes et des enregistrements non anonymes avec une portée globale. Les constantes et les constantes typées peuvent également apparaître dans les définitions de types imbriqués. Les constantes et constantes typées ne peuvent apparaître que dans les définitions de classes quand la classe est définie localement sur une procédure (c'est-à-dire qu'elles ne peuvent pas apparaître dans des enregistrements définis dans une procédure).

Champs de classe

Les champs de classe sont des champs de données d'une classe accessibles sans référence d'objet (à la différence des "champs d'instance" normaux qui sont traités ci-dessus). Les données stockées dans un champ de classe sont partagées par toutes les instances de la classe et peuvent être accessibles en se référant à la classe ou à une variable qui représente une instance de la classe.

La déclaration de bloc class var vous permet d'introduire un bloc de champs de classe dans une déclaration de classe. Tous les champs déclarés après class var ont des attributs de stockage statique. Un bloc class var se termine par :

  1. Une autre déclaration class var ou var
  2. Une déclaration de procédure ou fonction (c'est-à-dire une méthode) (y compris des procédures de classe et des fonctions de classe)
  3. Une déclaration de propriété (y compris des propriétés de classe)
  4. Une déclaration de constructeur ou de destructeur
  5. Un spécificateur de portée de visibilité (public, private, protected, published, strict private et strict protected)

Par exemple :

 type
     TMyClass = class
       public
         class var        // Introduce a block of class static fields.
           Red: Integer;
           Green: Integer;
           Blue: Integer;
         var              // Ends the class var block.
           InstanceField: Integer;
     end;

Les champs de classe Red, Green et Blue sont accessibles par le code :

 TMyClass.Red := 1;
 TMyClass.Green := 2;
 TMyClass.Blue := 3;

Les champs de classe sont aussi accessibles au moyen d'une instance de la classe. Avec la déclaration suivante :

 var
 	myObject: TMyClass;

Ce code a le même effet que les assignations de Red, Green et Blue ci-dessus :

 myObject.Red := 1;
 myObject.Green := 2;
 myObject.Blue := 3;

Voir aussi