A tulajdonság egy mód az objektum belső állapotához való hozzáférésre, valamilyen típusú változót utánozva. Egy objektum egy tulajdonságának elérése ugyanúgy néz ki, mint egy struct mező elérése (a strukturált programozásban), de valójában függvényhíváson keresztül valósul meg. Amikor megpróbálja beállítani ennek a tulajdonságnak az értékét, egy metódus hívódik meg, és amikor megpróbálja lekérni ennek a tulajdonságnak az értékét, egy másik metódus hívódik meg.
Tulajdonságok alkalmazásakor
Általában egy tulajdonság egy objektum valamilyen belső mezőjéhez van társítva . De lehet, hogy egy tulajdonság egyáltalán nem társítható egyetlen objektumváltozóhoz sem, bár az objektum felhasználója úgy kezeli, mintha valódi mező lenne.
A tulajdonságok növelik a programozás rugalmasságát és biztonságát, mert a (nyilvános) interfész részeként lehetővé teszik egy objektum belső megvalósításának megváltoztatását anélkül, hogy megváltoztatnák a mezőit. A tulajdonságok nagyban megkönnyítik a program módosítását olyan esetekben, amikor az osztály eredetileg a beágyazás megsértésével lett megvalósítva , majd később módosítani kellett a mező elérésének módját. Tulajdonsági mechanizmus hiányában a nyelvben szükséges lenne a mezőhivatkozások keresése és kicserélése accessor metódusokkal.
Sok programozási nyelvben a tulajdonságokat metóduspárként valósítják meg : a tulajdonság aktuális értékét fogadó metódust accessornak nevezzük ; egy új tulajdonságértéket beállító metódus egy mutátor . Az olyan programozási nyelvekben, amelyek nem támogatják a tulajdonságokat, mint például a C++ és a Java , az accessor/mutator pár gyakran helyettesíti őket.
A tulajdonság metódusait szokás a tulajdonság nevével a get és set előtagokkal elnevezni: például a Xyzzy tulajdonságnál get_Xyzzy és set_Xyzzy ( hagyományos C stílus ) vagy GetXyzzy és SetXyzzy ( CamelCase stílus ). Ennek az elnevezési sémának köszönhetően a getter és setter szlengnevek a property metódusokhoz ragadtak .
A C#-ban a tulajdonságok olyan mezők, amelyek egy logikai blokkot tartalmaznak, amely a és a kulcsszavakat gettartalmazza set.
Példa egy tulajdonsággal rendelkező osztályra:
class MyClass { private int p_field ; public int Field { get { return p_field ; } privát halmaz { p_field = érték ; } } }Megvalósítási példa VB.NET-ben. Ha csak olvasható vagy csak írható tulajdonságot szeretne megvalósítani, az csak olvasható és csak írható módosítók érvényesek. Az ingatlan paraméterezhető. Ez lehet alapértelmezett tulajdonság is, ehhez hozzá kell adni a Default módosítót
Sub Main Dim F Új Fooként _ F. _ Adatok = 5 F. _ Item ( 0 ) = 5 F ( 0 ) = 5 ' Írjon a Console tulajdonságba . WriteLine ( F ( 0 )) 'Tulajdonság olvasása End Sub Nyilvános osztály Foo Privát m_Data As Integer Private m_Arr () As Integer = { 1 , 2 , 3 , 4 , 5 } Nyilvános tulajdon adatok egész számként ( Érték egész számként ) ' Beállító m_Data = Értékvégi halmaz Get Return m_Data ' Getter End Get End tulajdonság Nyilvános alapértelmezett tulajdonságelem ( Param As Integer ) As Integer Alapértelmezett paraméterezett tulajdonságkészlet ( Érték As Integer ) m_Arr ( Param ) = Értékvégkészlet Get Return m_Arr ( Param ) End Get End Tulajdonságvégi osztály _ _ _Egy ingatlant Delphiben a szó ír le property.
Példa egy tulajdonsággal rendelkező osztályra:
TMyClass = class private FMyField : Integer ; eljárás SetMyField ( konst Érték : Integer ) ; függvény GetMyField : Integer ; public property MyField : Integer olvasás GetMyField írás SetMyField ; vége ; funkció TMyClass . GetMyField : Integer ; begin Eredmény := FMyField ; vége ; eljárás TMyClass . SetMyField ( állandó érték : egész szám ) ; begin FMyField := Érték ; vége ;A Ruby tulajdonságdeklarációi nem különböznek a metódus deklarációktól. Ha például egy időtartam tulajdonságot szeretne létrehozni a Song osztályhoz, le kell írnia a időtartam és a időtartam=(érték) metódusokat.
osztály Dal def időtartama @ időtartam vége def időtartam= ( érték ) @duration = érték vége végeEgy belső objektumváltozóhoz való egyszerű hozzáférés azonban helyettesíthető az attr_accessor :duration metódus meghívásával
osztály Dal attr_accessor :duration endMég érdekesebb az a példája, amikor egy duration_in_minutes tulajdonságot hozunk létre, amely visszaadja vagy beállítja az időtartamot percekben:
osztály Dal def időtartam_percekben @ időtartam / 60 . 0 vége def időtartam_percekben= ( érték ) @duration = ( érték * 60 ) . to_i end endAzonban a duration_in_minutes tulajdonság megváltoztatása hatással lesz az időtartam tulajdonságra. Például
dal = dal . új dal . időtartam_percekben = 1 . 2 nyomtatott dal . időtartam # 72-t nyomtatA dekorátorok módszerei határozzák meg, hogyan kell egy tulajdonsággal dolgozni (olvasás, írás, törlés). Ha bármelyik metódust eltávolítják (kivéve a @property), elveszik a tulajdonsággal való megfelelő munkavégzés képessége.
Példa egy tulajdonsággal rendelkező osztályra:
osztály A : def __init__ ( self ): self . __x = Nincs @property def x ( self ): önmagát adja vissza . __x @x . setter def x ( self , value ): self . __x = érték @x . törlő def x ( self ): self . __x = Nincs >>> a = A () >>> a . x >>> a . x = 2 >>> a . x 2 >>> del a . x >>> a . x >>>