__property

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Extensions de mots clés C++


Catégorie

Extensions des mots clés

Description

Le mot clé __property déclare un attribut d'une classe. Les propriétés apparaissent au programmeur juste comme un autre attribut (champ) d'une classe. Néanmoins, comme sa contrepartie en Object Pascal, le mot clé __property de Appmethod C++ ajoute beaucoup plus de fonctionnalités que la simple consultation et modification de la valeur de l'attribut. Puisque les attributs de propriété contrôlent complètement l'accès à la propriété, il n'y a pas de restriction sur la façon dont vous implémentez la propriété dans la classe elle-même.

Syntaxe

__property type propertyName [index1Type index1 ][indexNType indexN ] = { attributes }; 

où :

  • type est un type de données intrinsèque ou préalablement déclaré.
  • propertyName est un identificateur valide.
  • indexNType est un type de données intrinsèque ou préalablement déclaré.
  • indexN est le nom d'un paramètre index qui est transmis aux fonctions read et write de la propriété.
  • attributes est une séquence de read, write, stored ou index, séparés par des virgules.

Les paramètres indexN entre crochets sont facultatifs. S'ils sont présents, ils déclarent une propriété tableau. Les paramètres index sont transmis aux méthodes read et write de la propriété tableau.

Le mot clé __property a été ajouté pour prendre en charge la VCL.

L'exemple suivant illustre des déclarations de propriétés simples :

 class PropertyExample {

private:

	int Fx, Fy;

	float Fcells[100][100];

protected:
	int readX() {
		return (Fx);
	}

	void writeX(int newFx) {
		Fx = newFx;
	}

	double computeZ() {

		// Do some computation and return a floating-point value...

		return (0.0);

	}

	float cellValue(int row, int col) {
		return (Fcells[row][col]);
	}

public:
	__property int X = {read = readX, write = writeX};
	__property int Y = {read = Fy};
	__property double Z = {read = computeZ};
	__property float Cells[int row][int col] = {read = cellValue};

};

Cet exemple montre plusieurs déclarations de propriétés :

  • La propriété X a un accès en lecture-écriture via respectivement les fonctions membres readX et writeX.
  • La propriété Y correspond directement à la variable membre Fy, et elle est en lecture seule.
  • La propriété Z est une valeur en lecture seule qui est calculée, elle n'est pas stockée dans un membre de données de la classe.
  • La propriété Cells illustre une propriété tableau avec deux indices.

L'exemple suivant illustre la manière d'accéder à ces propriétés dans votre code :

// Previous code goes here
int main(int argc, char * argv[]) {
 PropertyExample myPropertyExample ;
 myPropertyExample.X = 42; // Evaluates to: myPropertyExample.WriteX(42) ;
 int  myVal1 = myPropertyExample.Y; // Evaluates to: myVal1 = myPropertyExample.Fy ;
 double  myVal2 = myPropertyExample.Z; // Evaluates to: myVal2 = myPropertyExample.ComputeZ() ;
 float  cellVal = myPropertyExample.Cells[3][7]; // Evaluates to : cellVal = myPropertyExample.cellValue(3,7);
}

Les propriétés ont beaucoup d'autres variations et fonctionnalités non présentées dans cet exemple.

Les propriétés peuvent également :

  • Associer la même méthode de lecture ou d'écriture à plusieurs propriétés, en utilisant l'attribut index.
  • Avoir des valeurs par défaut.
  • Etre stockées dans un fichier fiche.
  • Etendre une propriété définie dans une classe de base.

Prise en charge du compilateur

Les compilateurs BCC32 et OSX ne prennent pas en charge :

  1. Le mot clé default sur les propriétés indexées :
     __property int Items[int I] = {read=GetItem/*, default*/};
    
     __property int Items[int I] = {write=SetItem/*, default*/};
    
     __property int Items[int I] = {read=GetItem, write=SetItem/*, default*/};
    
  2. L'assignation composée, à l'inverse des compilateurs C++ basés sur Clang.
    Pour plus d'informations, voir __property : Assignation chaînée et composée.

Voir aussi