En egenskab er en måde at få adgang til den interne tilstand af et objekt, der efterligner en variabel af en eller anden type. Adgang til en egenskab for et objekt ser det samme ud som at få adgang til et struct-felt (i struktureret programmering), men implementeres faktisk via et funktionskald. Når du forsøger at indstille værdien af denne egenskab, kaldes en metode, og når du forsøger at få værdien af denne egenskab, kaldes en anden metode.
Ved anvendelse af egenskaber
Typisk er en egenskab forbundet med et eller andet internt felt i et objekt. Men en egenskab er muligvis ikke forbundet med nogen objektvariabel overhovedet, selvom brugeren af det pågældende objekt behandler det, som om det var et rigtigt felt.
Egenskaber øger fleksibiliteten og sikkerheden ved programmering, fordi de, som en del af en (offentlig) grænseflade, giver dig mulighed for at ændre den interne implementering af et objekt uden at ændre dets felter. Egenskaber gør det meget lettere at ændre programmet i tilfælde, hvor klassen oprindeligt blev implementeret med en overtrædelse af indkapsling , og senere var det nødvendigt at ændre den måde, hvorpå feltet tilgås. I mangel af en egenskabsmekanisme i sproget ville det være nødvendigt at søge efter og erstatte feltreferencer med accessormetoder.
I mange programmeringssprog implementeres egenskaber som et par metoder : en metode, der modtager den aktuelle værdi af en egenskab, kaldes en accessor ; en metode, der sætter en ny egenskabsværdi, er en mutator . I programmeringssprog, der ikke understøtter egenskaber, såsom C++ og Java , er accessor/mutator-parret et almindeligt surrogat til at erstatte dem.
Det er sædvanligt at navngive egenskabsmetoder efter egenskabens navn med præfikserne get og set : for eksempel for Xyzzy-egenskaben , get_Xyzzy og set_Xyzzy ( traditionel C -stil ) eller GetXyzzy og SetXyzzy ( CamelCase -stil ). På grund af dette navneskema har slangnavnene getter og setter holdt sig til egenskabsmetoder .
Egenskaber i C# er felter med en logisk blok, der indeholder nøgleordene getog set.
Et eksempel på en klasse med en egenskab:
klasse MyClass { private int p_field ; public int Field { get { return p_field ; } privat sæt { p_felt = værdi ; } } }Implementeringseksempel i VB.NET. Hvis du vil implementere en skrivebeskyttet eller skrivebeskyttet egenskab , gælder ReadOnly og WriteOnly-modifikatorerne. Egenskaben kan parametreres. Det kan også være en standardegenskab, for dette skal du tilføje standardmodifikatoren
Sub Main Dim F Som Ny Foo F. _ Data = 5 F. _ Element ( 0 ) = 5 F ( 0 ) = 5 ' Skriv til konsolegenskaben . WriteLine ( F ( 0 )) 'Læs egenskab End Sub Offentlig klasse 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 parameteriseret egenskab Sæt ( Value As Integer ) m_Arr ( Param ) = Value End Set Get Return m_Arr ( Param ) End Get End Property End ClassEn ejendom i Delphi er beskrevet med ordet property.
Et eksempel på en klasse med en egenskab:
TMyClass = klasse privat FMyField : Heltal ; procedure SetMyField ( const Value : Integer ) ; funktion GetMyField : Heltal ; public property MyField : Heltal læs GetMyField skriv SetMyField ; ende ; funktion TMyClass . GetMyField : Heltal ; start Resultat := FMyField ; ende ; procedure TMyClass . SetMyField ( const Value : Integer ) ; start FMyField := Værdi ; ende ;Ejendomserklæringer i Ruby adskiller sig ikke fra metodedeklarationer. For at oprette en varighedsegenskab for Song-klassen skal du for eksempel beskrive metoderne varighed og varighed=(værdi)
klasse Sang def varighed @varighed slut def varighed= ( værdi ) @varighed = værdi slut slutEn simpel adgang til en intern objektvariabel kan dog erstattes af et kald til metoden attr_accessor :duration
klasse Sang attr_accessor :varighed slutMere interessant er eksemplet med at oprette en egenskab duration_in_minutes, der returnerer eller indstiller varighedstiden i minutter:
klasse Sang def duration_in_minutes @duration / 60 . 0 slut def duration_in_minutes= ( værdi ) @varighed = ( værdi * 60 ) . to_i ende endeÆndring af egenskaben duration_in_minutes vil dog påvirke varighedsegenskaben. For eksempel
sang = sang . ny sang . varighed_i_minutter = 1 . 2 trykte sange . varighed # udskrives 72Et sæt metoder med dekoratører definerer, hvordan man arbejder med en ejendom (læse, skrive, slette). Hvis nogen af metoderne fjernes (med undtagelse af @property), mistes muligheden for at arbejde med ejendommen på den passende måde.
Et eksempel på en klasse med en egenskab:
klasse A : def __init__ ( selv ): selv . __x = Ingen @property def x ( selv ): returner selv . __x @x . setter def x ( selv , værdi ): selv . __x = værdi @x . slette def x ( selv ): selv . __x = Ingen >>> a = A () >>> a . x >>> a . x = 2 >>> a . x 2 >>> del en . x >>> a . x >>>