__property

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Schlüsselwort-Erweiterungen in C++


Kategorie

Schlüsselwort-Erweiterungen

Beschreibung

Das Schlüsselwort __property deklariert ein Attribut einer Klasse. Eigenschaften sind für Programmierer nichts weiter als andere Attribute (Felder) einer Klasse. Wie die Entsprechung in Object Pascal fügt aber das Schlüsselwort __property von C++Builder einen deutlich erweiterten Funktionsumfang hinzu, der über das Untersuchen und Ändern des Attributwerts hinausgeht. Weil Eigenschaftsattribute den Zugriff auf die Eigenschaft vollständig steuern, gibt es keine Beschränkungen hinsichtlich der Implementierung der Eigenschaft innerhalb der Klasse.

Syntax

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

Bedeutung der Parameter:

  • type ist ein intrinsischer oder bereits deklarierter Datentyp.
  • propertyName ist ein beliebiger gültiger Bezeichner.
  • indexNType ist ein intrinsischer oder bereits deklarierter Datentyp.
  • indexN ist der Name eines Indexparameters, der an die Lese- und Schreibfunktionen der Eigenschaft übergeben wird.
  • attributes ist eine durch Komma getrennte Folge von read, write, stored oder index.

Die indexN-Parameter in eckigen Klammern sind optional. Wenn vorhanden, deklarieren sie eine Array-Eigenschaft. Die index-Parameter werden an die Lese- und Schreibmethoden der Array-Eigenschaft übergeben.

Das Schlüsselwort __property wurde zur Unterstützung der VCL hinzugefügt.

Das folgende Beispiel zeigt einige einfache Eigenschaftsdeklarationen:

 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};

};

Dieses Beispiel zeigt mehrere Eigenschaftsdeklarationen:

  • Die Eigenschaft X verfügt durch die Member-Funktionen readX bzw. writeX über Lese-Schreib-Zugriff.
  • Die Eigenschaft Y ist direkt der Member-Variable Fy zugeordnet und ist schreibgeschützt.
  • Die Eigenschaft Z ist ein schreibgeschützter Wert, der berechnet wird; sie wird nicht als Daten-Member in der Klasse gespeichert.
  • Die Eigenschaft Cells demonstriert eine Array-Eigenschaft mit zwei Indizes.

Das nächste Beispiel zeigt, wie auf diese Eigenschaften im Quelltext zugegriffen wird:

// 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);
}

Eigenschaften haben viele andere Variationen und Features, die in diesem Beispiel nicht gezeigt wurden.

Eigenschaften können auch:

  • Dieselbe Lese- oder Schreibmethode mit dem Attribut index mehr als einer Eigenschaft zuweisen.
  • Standardwerte haben.
  • In einer Formulardatei gespeichert werden.
  • Eine in einer Basisklasse definierte Eigenschaft erweitern.

Compiler-Unterstützung

Die BCC32- und OSX-Compiler unterstützen Folgendes nicht:

  1. Das Schlüsselwort default für indizierte Eigenschaften:
     __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. Verbundzuweisungen im Gegensatz zu Durch Clang erweiterte C++-Compiler.
    Weitere Informationen finden Sie unter __property: Verbund- und verkettete Zuweisung.

Siehe auch