Champs (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Classes et objets - Index

Cette rubrique décrit la syntaxe des déclarations de champs de données de 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. (Donc, 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 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.

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


type
   TAncestor = class
      Value: Integer;
   end;

   TDescendant = class(TAncestor)
      Value: string;    // masque le champ Valeur hérité
   end;

var
   MyObject: TAncestor;

begin
   MyObject := TDescendant.Create;
   MyObject.Value := 'Hello!'     // erreur

  (MyObject as TDescendant).Value := 'Hello!'   // correct!
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 constantes et les déclarations 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 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        // Introduit un bloc de champs statiques de classe.
          Red: Integer;
          Green: Integer;
          Blue: Integer;
        var              // Termine le bloc class var.
          InstanceField: Integer;
    end;

Les champs de classe Red, Green et Blue sont accessibles au moyen du 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 affectations Red, Green et Blue ci-dessus :

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

Voir aussi