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.
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 .
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 ; } } }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 ClassEn 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 ;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 slutEn enkel åtkomst till en intern objektvariabel kan dock ersättas av ett anrop till metoden attr_accessor :duration
class Song attr_accessor :duration endMer 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 slutOm 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 72En 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 >>>