Egendom (programmering)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 28 februari 2014; kontroller kräver 12 redigeringar .

En egenskap  är ett sätt att komma åt det interna tillståndet för ett objekt, som imiterar en variabel av någon typ. Att komma åt en egenskap hos ett objekt ser ut på samma sätt som att komma åt ett struct-fält (i strukturerad programmering), men implementeras faktiskt via ett funktionsanrop. När du försöker ställa in värdet på den här egenskapen anropas en metod, och när du försöker få värdet på den här egenskapen anropas en annan metod.

Vid tillämpning av egenskaper

Vanligtvis är en egenskap associerad med något internt fält i ett objekt. Men en egenskap kanske inte alls är associerad med någon objektvariabel, även om användaren av det objektet hanterar det som om det vore ett riktigt fält.

Egenskaper ökar flexibiliteten och säkerheten i programmering eftersom de, som en del av ett (offentligt) gränssnitt, låter dig ändra den interna implementeringen av ett objekt utan att ändra dess fält. Egenskaper gör det mycket lättare att modifiera programmet i fall där klassen ursprungligen implementerades med en kränkning av encapsulation , och senare var det nödvändigt att ändra sättet att komma åt fältet. I avsaknad av en egenskapsmekanism i språket skulle det vara nödvändigt att söka efter och ersätta fältreferenser med accessormetoder.

Egenskapsmetoder

I många programmeringsspråk implementeras egenskaper som ett par metoder : en metod som tar emot det aktuella värdet av en egenskap kallas en accessor ; en metod som anger ett nytt egenskapsvärde är en mutator . I programmeringsspråk som inte stöder egenskaper, såsom C++ och Java , är accessor/mutatorparet ett vanligt surrogat för att ersätta dem.

Det är vanligt att namnge egenskapsmetoder efter egenskapens namn med prefixen get och set : till exempel för egenskapen Xyzzy ,  get_Xyzzy och set_Xyzzy ( traditionell C -stil ) eller GetXyzzy och SetXyzzy ( CamelCase -stil ). På grund av detta namnschema har slangnamnen getter och setter hållit fast vid egenskapsmetoder .

Exempel

Egenskaper i C#

Egenskaper i C# är fält med ett logiskt block som innehåller nyckelorden getoch set.

Ett exempel på en klass med en egenskap:

class MyClass { privat int p_field ; public int Field { get { return p_field ; } privat set { p_field = värde ; } } }

Egenskaper i VB.NET

Implementeringsexempel i VB.NET. Om du vill implementera en skrivskyddad eller skrivskyddad egenskap gäller modifierarna ReadOnly och WriteOnly. Egenskapen kan parametreras. Det kan också vara en standardegenskap, för detta måste du lägga till standardmodifieraren

Sub Main Dim F Som ny Foo F. _ Data = 5 F. _ Objekt ( 0 ) = 5 F ( 0 ) = 5 ' Skriv till konsolegenskapen . WriteLine ( F ( 0 )) 'Läs egenskap End Sub Public Class Foo Privat m_Data Som heltal Privat m_Arr () Som heltal = { 1 , 2 , 3 , 4 , 5 } Public Property Data As Integer Set ( Value As Integer ) 'Setter m_Data = Value End Set Get Return m_Data 'Getter End Get End Property Public Default Property Item ( Param As Integer ) As Integer ' Standard parameteriserad egenskap Set ( Value As Integer ) m_Arr ( Param ) = Value End Set Get Return m_Arr ( Param ) End Get End Property End Class

Egenskaper i Delphi

En fastighet i Delphi beskrivs med ordet property.

Ett exempel på en klass med en egenskap:

TMyClass = klass privat FMyField : Heltal ; procedure SetMyField ( const Value : Integer ) ; function GetMyField : Heltal ; public property MyField : Heltal läs GetMyField skriv SetMyField ; slut ; funktion TMyClass . GetMyField : Heltal ; börja Resultat := FMyField ; slut ; procedur TMyClass . SetMyField ( const Value : Integer ) ; börja FMyField := Värde ; slut ;

Egenskaper i ActionScript

class MyClass { privat _foo : int ; public function get foo () : int { return _foo ; } public function set foo ( foo : int ) : void { _foo = foo ; } }

Egenskaper i mål C

@interface Företag  : NSObject { NString * var_name ; } @property ( behåll ) NSString * var_namn ; @slutet @ implementeringsföretag @synthesize var_name ; @slutet

Egenskaper i Ruby

Fastighetsdeklarationer i Ruby skiljer sig inte från metoddeklarationer. För att till exempel skapa en duration-egenskap för Song-klassen måste du beskriva metoderna duration och duration=(värde)

class Song def duration @duration end def duration= ( värde ) @duration = värde slut slut

En enkel åtkomst till en intern objektvariabel kan dock ersättas av ett anrop till metoden attr_accessor :duration

class Song attr_accessor :duration end

Mer intressant är exemplet med att skapa en duration_in_minutes-egenskap som kommer att returnera eller ställa in varaktighetstiden i minuter:

class Song def duration_in_minutes @duration / 60 . 0 slut def duration_in_minutes= ( värde ) @duration = ( värde * 60 ) . till_i slut slut

Om du ändrar egenskapen duration_in_minutes kommer det dock att påverka duration-egenskapen. Till exempel

sång = sång . ny låt . duration_in_minutes = 1 . 2 tryckta sång . varaktighet # kommer att skrivas ut 72

Egenskaper i Python

En uppsättning metoder med dekoratörer definierar hur man arbetar med en egenskap (läsa, skriva, radera). Om någon av metoderna tas bort (med undantag för @property) går förmågan att arbeta med fastigheten på lämpligt sätt förlorad.

Ett exempel på en klass med en egenskap:

klass A : def __init__ ( själv ): själv . __x = Ingen @property def x ( self ): returnera själv . __x @x . setter def x ( själv , värde ): själv . __x = värde @x . radera def x ( själv ): själv . __x = Ingen >>> a = A () >>> a . x >>> a . x = 2 >>> a . x 2 >>> del en . x >>> a . x >>>

Se även