Eigenschaft (Programmierung)

A Eigentum, in einigen objektorientierter Programmiersprachen, ist eine besondere Art von Art von Klasse Mitglied, mittlerer Funktionalität zwischen a aufstellen (oder Datenmitglied) und a Methode. Die Syntax für das Lesen und Schreiben von Eigenschaften ist wie für Felder, aber Eigentumslesungen und Schreibvorgänge werden (normalerweise) übersetzt 'übersetzt'Getter' und 'Setter'Methodenaufrufe. Die feldähnliche Syntax ist einfacher zu lesen und zu schreiben als viele Methodenaufrufe, aber die Interposition von Methodenaufrufen "unter der Haube" ermöglicht es Datenvalidierung, Aktive Aktualisierung (z. B. von GUI Elemente) oder Implementierung dessen, was als "schreibgeschützte Felder" bezeichnet werden kann.

Siehe ein lehrreiches Beispiel für C# -Sprache unten.

Unterstützung in Sprachen

Programmiersprachen, die Eigenschaften unterstützen Aktionen 3, C#, D, Delphi/Kostenloser Pascal, EC, F#, Kotlin, JavaScript, Ziel-C 2.0, Python, Scala, Schnell, Lua, und Visual Basic.

Einige objektorientierte Sprachen, wie z. Java und C ++Unterstützen Sie keine Eigenschaften, wodurch der Programmierer ein Paar von definiert werden muss Accessor und Mutator Methoden stattdessen.[1]

Oberon-2 Bietet einen alternativen Mechanismus unter Verwendung von Objektvariablen -Sichtbarkeitsflags.

Andere Sprachen, die für die entwickelt wurden Java virtuelle Maschine, wie zum Beispiel GroovigUnterstützen Sie die Eigenschaften nativ.

Während C ++ hat keine erstklassigen Eigenschaften, sie können mit emuliert werden Bedienerüberlastung.[2]

Beachten Sie auch, dass einige C ++ - Compiler erstklassige Eigenschaften als Sprachverlängerungen unterstützen.

In vielen objektorientierten Sprachen werden Eigenschaften als Paar Accessor/Mutator -Methoden implementiert, aber mit derselben Syntax wie bei öffentlichen Feldern zugegriffen. Die Auslassung einer Methode aus dem Paar ergibt a schreibgeschützt oder eine ungewöhnliche Schreibschreiber Eigentum.

In einigen Sprachen ohne integrierte Unterstützung für Eigenschaften kann ein ähnliches Konstrukt als eine einzelne Methode implementiert werden, die je nach Kontext des Aufrufs entweder die zugrunde liegenden Daten zurückgibt oder ändert. Solche Techniken werden verwendet, z. in Perl.

Einige Sprachen (Rubin, Smalltalk) Erreichen Sie die Eigenschaft-ähnliche Syntax mit normalen Methoden, manchmal mit einer begrenzten Menge an syntethischer Zucker.

Syntaxvarianten

Einige Sprachen folgen gut etablierten Syntaxkonventionen, um Eigenschaften und Methoden formell anzugeben und zu verwenden.

Unter diesen Konventionen:

  • Punktnotation
  • Klammer Notation

Punktnotation

Das folgende Beispiel zeigt die Punktnotation in JavaScript.

dokumentieren.CreateLement('Vor'); 

Klammer Notation

Das folgende Beispiel zeigt die Halterungsnotation in JavaScript.

dokumentieren["CreateLement"] ('Vor'); 

Beispielsyntax

C#

Klasse Stift  {  Privatgelände int Farbe; // privates Feld       // öffentliches Eigentum  Öffentlichkeit int Farbe   {    erhalten  {  Rückkehr Dies.Farbe;  }  einstellen   {  wenn (Wert > 0) {  Dies.Farbe = Wert;  }  }  } } 
// Zugriff: Stift Stift = Neu Stift(); int color_tmp = 0; // ... Stift.Farbe = 17; color_tmp = Stift.Farbe; // ... Stift.Farbe = ~Stift.Farbe; // bitweise Komplement ... // Ein weiteres dummes Beispiel: Stift.Farbe += 1; // viel klarer als "pen.set_color (pen.get_color () + 1)"! 

Jüngste C# -Versionen ermöglichen auch "automatisch implementierte Eigenschaften", wobei das Backing-Feld für die Eigenschaft vom Compiler während der Zusammenstellung generiert wird. Dies bedeutet, dass die Eigenschaft einen Setter haben muss. Es kann jedoch privat sein.

Klasse Form  {       Öffentlichkeit INT32 Höhe { erhalten; einstellen; }  Öffentlichkeit INT32 Breite  { erhalten; Privatgelände einstellen; }      } 

C ++

C ++ hat keine erstklassigen Eigenschaften, aber es gibt verschiedene Möglichkeiten, Eigenschaften in begrenztem Maße zu emulieren. Zwei davon folgen:

Verwenden von Standard C ++

#enthalten  Schablone <Modellname T> Klasse Eigentum {   T Wert;   Öffentlichkeit:   T & Operator = (Const T &i) {   Rückkehr Wert = i;   }   // Diese Funktionsvorlage für Vorlagenklassenmitglieder dient dem Ziel, zu erfüllen   // strenger eingeben. Die Zuordnung dazu ist nur mit exakten identischen Typen möglich.   // Der Grund, warum es einen Fehler verursacht, ist eine temporäre Variable, die während der impliziten Typumwandlung in der Referenzinitialisierung erstellt wurde.   Schablone <Modellname T2> T2 & Operator = (Const T2 &i) {   T2 &bewachen = Wert;   Wurf bewachen; // nie erreicht.   }   // implizite Konvertierung zurück zu T.    Operator T Const & () Const {   Rückkehr Wert;   } }; Struktur Foo {   // Eigenschaften mit nicht genannten Klassen.   Klasse {   int Wert;   Öffentlichkeit:   int & Operator = (Const int &i) { Rückkehr Wert = i; }   Operator int () Const { Rückkehr Wert; }   } Alpha;   Klasse {   schweben Wert;   Öffentlichkeit:   schweben & Operator = (Const schweben &f) { Rückkehr Wert = f; }   Operator schweben () Const { Rückkehr Wert; }   } Bravo; }; Struktur Bar {   // Verwenden der Eigenschaft <>-Vorlage.   Eigentum <bool> Alpha;   Eigentum <ohne Vorzeichen int> Bravo; }; int hauptsächlich () {   Foo Foo;   Foo.Alpha = 5;   Foo.Bravo = 5.132f;   Bar Bar;   Bar.Alpha = Stimmt;   Bar.Bravo = Stimmt; // Diese Zeile liefert einen Kompilierungszeitfehler   // Aufgrund der Funktion der Schutzvorlage.   ::std::Cout << Foo.Alpha << ","   << Foo.Bravo << ","   << Bar.Alpha << ","   << Bar.Bravo   << ::std::Endl;   Rückkehr 0; } 

Siehe auch Paketüberfluss Für ein detaillierteres Beispiel.

C ++, Microsoft, GCC, LLVM/Clang und C ++ builderspezifisch

Ein Beispiel aus dem MSDN Dokumentationsseite.

// declspec_property.cpp Struktur S {   int i;   Leere putprop(int j)   {    i = j;   }   int GetProp()   {   Rückkehr i;   }   __declspec(Eigentum(erhalten = GetProp, stellen = putprop)) int The_Prop; }; int hauptsächlich() {   S s;   s.The_Prop = 5;   Rückkehr s.The_Prop; } 

D

Klasse Stift {  Privatgelände int m_color; // privates Feld       // Öffentliche Eigentum bekommen  Öffentlichkeit int Farbe () {  Rückkehr m_color;  }       // öffentliches Eigentum  Öffentlichkeit Leere Farbe (int Wert) {  m_color = Wert;  } } 
Auto Stift = Neu Stift; Stift.Farbe = ~Stift.Farbe; // bitweise Ergänzung // Die SET -Eigenschaft kann auch in Ausdrücken verwendet werden, genau wie die reguläre Zuordnung int die Farbe = (Stift.Farbe = 0xff0000); 

In d Version 2 muss jeder Eigenschaftszubehör oder Mutator mit @Property markiert sein:

Klasse Stift {  Privatgelände int m_color; // privates Feld       // Öffentliche Eigentum bekommen  @Eigentum Öffentlichkeit int Farbe () {  Rückkehr m_color;  }       // öffentliches Eigentum  @Eigentum Öffentlichkeit Leere Farbe (int Wert) {  m_color = Wert;  } } 

Delphi/freies Pascal

Typ Tpen = Klasse  Privatgelände  Fcolor: Tcolor;  Funktion GetColor: Tcolor;  Verfahren SetColor(Const Ein Wert: Tcolor);  Öffentlichkeit  Eigentum Farbe: Ganze Zahl lesen GetColor schreiben SetColor; Ende; Funktion Tpen.GetColor: Tcolor; Start  Ergebnis : = Fcolor; Ende; Verfahren Tpen.SetColor(Const Ein Wert: Tcolor); Start  wenn Fcolor <> Ein Wert  dann Fcolor : = Ein Wert; Ende; 
// Zugriff: var Stift: Tpen; // ... Stift.Farbe : = nicht Stift.Farbe; (* Delphi unterstützt auch eine "Direct -Feld" -Syntax - Eigenschaft Farbe: tcolor read fcolor write setColor; oder Eigenschaft Farbe: tcolor read getColor write fcolor; wo der Compiler genau den gleichen Code generiert wie zum Lesen und Schreiben ein Feld. Dies bietet die Effizienz eines Feldes mit der Sicherheit einer Immobilie. (Sie können keinen Zeiger auf die Eigenschaft bekommen und Sie können das Mitglied immer ersetzen Zugriff mit einem Methodenaufruf.) *) 

EC

Klasse Stift  {   // privates Datenmitglied   Farbe Farbe; Öffentlichkeit:   // öffentliches Eigentum   Eigentum Farbe Farbe    {     erhalten { Rückkehr Farbe; }   einstellen { Farbe = Wert; }   } } Stift Schwarzer Stift { Farbe = Schwarz }; Stift Whitepen { Farbe = Weiß }; Stift Pen3 { Farbe = { 30, 80, 120 } }; Stift Pen4 { Farbe = ColorHSV { 90, 20, 40 } }; 

F#

Typ Stift() = Klasse  Lassen veränderlich _Farbe = 0  Mitglied Dies.Farbe  mit erhalten() = _Farbe  und einstellen Wert = _Farbe <- Wert Ende 
Lassen Stift = Neu Stift() Stift.Farbe <- ~~~Stift.Farbe 

JavaScript

Funktion Stift() {  Dies._Farbe = 0; } // Fügen Sie die Eigenschaft dem Stifttyp selbst hinzu, kann auch // auf der Instanz einzeln eingestellt werden Objekt.DefineProperties(Stift.Prototyp, {  Farbe: {  erhalten: Funktion () {  Rückkehr Dies._Farbe;  },  einstellen: Funktion (Wert) {  Dies._Farbe = Wert;  }  } }); 
var Stift = Neu Stift(); Stift.Farbe = ~Stift.Farbe; // bitweise Ergänzung Stift.Farbe += 1; // Füge eins hinzu 

ActionScript 3.0

Paket  { 	Öffentlichkeit Klasse Stift { 		Privatgelände var _bitcoin. = 0; 		 		Öffentlichkeit Funktion erhalten Wight ():uint { 			Rückkehr _bitcoin/; 		} 		 		Öffentlichkeit Funktion einstellen Farbe(Wert:uint):Leere { 			_Farbe = Wert; 		} 	} } 
var Stift:Stift = Neu Stift(); Stift.Farbe = ~Stift.Farbe; // bitweise Ergänzung Stift.Farbe += 1; // füge eins hinzu 

Ziel-C 2.0

@Schnittstelle Stift: NSOBJECT @Eigentum (Kopieren) Nscolor *Farbe;	// Das Attribut "Kopie" bewirkt, dass die Kopie des Objekts ist 					// zurückgehalten, anstelle des Originals. @Ende @Implementierung Stift @synthesize Farbe;			// Compiler -Richtlinie zur Synthese -Accessor -Methoden. 					// Es kann in Xcode 4.5 und später zurückgelassen werden. @Ende 

Das obige Beispiel könnte in einer beliebigen Methode wie folgt verwendet werden:

Stift *Stift = [[Stift Alloc] drin]; Stift.Farbe = [Nscolor schwarze Farbe]; schweben rot = Stift.Farbe.Redcomponent; [Stift.Farbe DrawswatchinRect: NSMAKERECT(0, 0, 100, 100)]; 

Php

Klasse Stift {  Privatgelände int $ Farbe = 1;  Funktion __einstellen($ Eigentum, $ Wert)  {  wenn (Property_exists($ das, $ Eigentum)) {   $ das->$ Eigentum = $ Wert;  }  }  Funktion __erhalten($ Eigentum)  {  wenn (Property_exists($ das, $ Eigentum)) {  Rückkehr $ das->$ Eigentum;  }  Rückkehr Null;  } } 
$ p = Neu Stift(); $ p->Farbe = ~$ p->Farbe; // bitweise Ergänzung Echo $ p->Farbe; 

Python

Eigenschaften funktionieren nur für Kurse im neuen Stil korrekt (Klassen, die haben Objekt Als ein Superklasse), und sind nur in Python 2.2 und neuer erhältlich (siehe der entsprechende Abschnitt des Tutorials Vereinheitliche Typen und Klassen in Python 2.2). Python 2.6 fügte eine neue Syntax hinzu, an der Dekorateure zur Definition von Eigenschaften beteiligt waren.

Klasse Stift:  def __drin__(selbst) -> Keiner:  selbst._Farbe = 0  # "private" Variable  @Eigentum  def Farbe(selbst):  Rückkehr selbst._Farbe  @Farbe.Setter  def Farbe(selbst, Farbe):  selbst._Farbe = Farbe 
Stift = Stift() # Zugriff: Stift.Farbe = ~Stift.Farbe  # Bitgewise -Komplement ... 

Rubin

Klasse Stift  def initialisieren  @Farbe = 0  Ende       # Definiert einen Getter für das @Color -Feld  def Farbe  @Farbe  Ende  # Definiert einen Setter für das Feld @Color  def Farbe =(Wert)  @Farbe = Wert  Ende Ende Stift = Stift.Neu Stift.Farbe = ~Stift.Farbe  # Bitgewise -Komplement 

Ruby bietet auch automatische Getter/Setter -Synthesizer, die als Instanzmethoden der Klasse definiert sind.

Klasse Stift  Attr_reader :Marke  # Generiert einen Getter für @Brand (schreibgeschützte)  Attr_writer :Größe  # Generiert einen Setter für @SIZE (Schreibschreiber)  Attr_Accessor :Farbe  # Generiert sowohl einen Getter als auch einen Setter für @Color (lesen/schreiben)  def initialisieren  @Farbe = 0  # Im Objekt können wir direkt auf die Instanzvariable zugreifen  @Marke = "Penbrand"  @Größe = 0.7  # Aber wir könnten auch die Setter -Methode verwenden,  Ende Ende Stift = Stift.Neu stellt Stift.Marke  # Zugriff auf die Stiftmarke über den generierten Getter Getter Stift.Größe = 0.5  # Aktualisiert das Größenfeld des Stifts über den generierten Setter Stift.Farbe = ~Stift.Farbe 

Visual Basic

Visual Basic (.NET 2003-2010)

Öffentlichkeit Klasse Stift    Privatgelände _Farbe Wie Ganze Zahl 'Privates Feld  Öffentlichkeit Eigentum Farbe() Wie Ganze Zahl ' Öffentliches Eigentum  Erhalten  Zurückkehren _Farbe  Ende Erhalten  Satz(Byval Wert Wie Ganze Zahl)  _Farbe = Wert  Ende Satz  Ende Eigentum Ende Klasse 
'Erstellen Sie die Stiftklasseninstanz Schwach Stift Wie Neu Stift() 'Wert setzen Stift.Farbe = 1 ' Wert erhalten Schwach Farbe Wie INT32 = Stift.Farbe 

Visual Basic (nur .NET 2010)

Öffentlichkeit Klasse Stift  Öffentlichkeit Eigentum Farbe() Wie Ganze Zahl ' Öffentliches Eigentum Ende Klasse 
'Erstellen Sie die Stiftklasseninstanz Schwach Stift Wie Neu Stift() 'Wert setzen Stift.Farbe = 1 ' Wert erhalten Schwach Farbe Wie INT32 = Stift.Farbe 

Visual Basic 6

'In einer Klasse namens Clspen Privatgelände m_color Wie Lang Öffentlichkeit Eigentum Erhalten Farbe() Wie Lang  Farbe = m_color Ende Eigentum Öffentlichkeit Eigentum Lassen Farbe(Byval RHS Wie Lang)  m_color = RHS Ende Eigentum 
'Zugriff: Schwach Stift Wie Neu Clspen '... Stift.Farbe = Nicht Stift.Farbe 

Siehe auch

Verweise

  1. ^ "Accessors und Mutatoren in Java". C# Corner - Community von Software- und Datenentwicklern. Abgerufen 5. Januar 2022.
  2. ^ "Portabilität nativer C ++ - Eigenschaften". Paketüberfluss. Paketüberfluss. Abgerufen 5. Januar 2022.
  3. ^ "Eigenschaft (C ++)". Microsoft Technische Dokumentation. Microsoft. Abgerufen 5. Januar 2022.
  4. ^ "Clang :: MSPROPERTYDECL -Klassenreferenz". Clang: Eine C -Sprachfamilie Frontend für LLVM. Abgerufen 5. Januar 2022.
  5. ^ "__Property Keyword -Erweiterung". Embarcadero/Idera Dokumentation Wiki. Abgerufen 5. Januar 2022.