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.
- Im Microsoft Visual Studio,[3] GCC, und llvm/klang,[4] das
__declspec (Eigenschaft)
schafft ähnliche Eigenschaften wie C#. - Borland C ++ und Borland/Codegar/Embarcadero C ++ Builder Verwenden Sie das
__Eigentum
Stichwort.[5]
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
- Attribut (Computing)
- Gebundenes Eigentum
- Feld (Informatik)
- Indexer (Programmierung)
- Methode (Computerprogrammierung)
- Mutatormethode
- Einheitliches Zugangsprinzip
Verweise
- ^ "Accessors und Mutatoren in Java". C# Corner - Community von Software- und Datenentwicklern. Abgerufen 5. Januar 2022.
- ^ "Portabilität nativer C ++ - Eigenschaften". Paketüberfluss. Paketüberfluss. Abgerufen 5. Januar 2022.
- ^ "Eigenschaft (C ++)". Microsoft Technische Dokumentation. Microsoft. Abgerufen 5. Januar 2022.
- ^ "Clang :: MSPROPERTYDECL -Klassenreferenz". Clang: Eine C -Sprachfamilie Frontend für LLVM. Abgerufen 5. Januar 2022.
- ^ "__Property Keyword -Erweiterung". Embarcadero/Idera Dokumentation Wiki. Abgerufen 5. Januar 2022.