O proprietate este o modalitate de a accesa starea internă a unui obiect, imitând o variabilă de un anumit tip. Accesarea unei proprietăți a unui obiect arată la fel ca accesarea unui câmp struct (în programarea structurată), dar este implementată de fapt printr-un apel de funcție. Când încercați să setați valoarea acestei proprietăți, este apelată o metodă, iar când încercați să obțineți valoarea acestei proprietăți, este apelată o altă metodă.
La aplicarea proprietăților
De obicei, o proprietate este asociată cu un câmp intern al unui obiect. Dar o proprietate poate să nu fie asociată cu nicio variabilă de obiect, deși utilizatorul acelui obiect se ocupă de ea ca și cum ar fi un câmp real.
Proprietățile cresc flexibilitatea și securitatea programării deoarece, ca parte a unei interfețe (publice), vă permit să modificați implementarea internă a unui obiect fără a-i modifica câmpurile. Proprietățile facilitează modificarea programului în cazurile în care clasa a fost implementată inițial cu o încălcare a încapsulării , iar ulterior a fost necesară modificarea modului în care este accesat câmpul. În absența unui mecanism de proprietate în limbaj, ar fi necesară căutarea și înlocuirea referințelor de câmp cu metode accesorii.
În multe limbaje de programare, proprietățile sunt implementate ca o pereche de metode : o metodă care primește valoarea curentă a unei proprietăți se numește accesor ; o metodă care stabilește o nouă valoare a proprietății este un mutator . În limbajele de programare care nu acceptă proprietăți, cum ar fi C++ și Java , perechea accesor/mutator este un surogat comun pentru a le înlocui.
Este obișnuit să denumim metodele de proprietate după numele proprietății cu prefixele get și set : de exemplu, pentru proprietatea Xyzzy , get_Xyzzy și set_Xyzzy ( stil tradițional C ) sau GetXyzzy și SetXyzzy ( stil CamelCase ). Datorită acestei scheme de denumire, numele argoului getter și setter s-au lipit de metodele de proprietate .
Proprietățile în C# sunt câmpuri cu un bloc logic care conține cuvintele cheie getși set.
Un exemplu de clasă cu o proprietate:
clasa MyClass { private int p_field ; public int Câmp { get { return p_field ; } set privat { p_field = valoare ; } } }Exemplu de implementare în VB.NET. Dacă doriți să implementați o proprietate numai pentru citire sau numai pentru scriere , se aplică modificatorii ReadOnly și WriteOnly. Proprietatea poate fi parametrizată. Poate fi, de asemenea, o proprietate implicită, pentru aceasta trebuie să adăugați modificatorul Default
Sub Main Dim F As New Foo F. _ Date = 5 F . Item ( 0 ) = 5 F ( 0 ) = 5 ' Scriere în proprietatea Console . WriteLine ( F ( 0 )) 'Citește proprietatea End Sub Public Class Foo Private m_Data As Integer Private m_Arr () As Integer = { 1 , 2 , 3 , 4 , 5 } Date de proprietate publică ca set întreg ( Value As Integer ) 'Setter m_Data = Value End Set Get Return m_Data 'Getter End Get End Property Element de proprietate public implicit ( Param As Integer ) As Integer ' Proprietatea parametrizată implicită Set ( Value As Integer ) m_Arr ( Param ) = Value End Set Get Return m_Arr ( Param ) End Get End Property End ClassO proprietate din Delphi este descrisă de cuvântul property.
Un exemplu de clasă cu o proprietate:
TMyClass = clasă privată FMyField : Integer ; procedura SetMyField ( const Value : Integer ) ; funcția GetMyField : Integer ; proprietate publică MyField : Integer read GetMyField scrie SetMyField ; sfârşitul ; funcția TMyClass . GetMyField : Integer ; începe Rezultatul := FMyField ; sfârşitul ; procedura TMyClass . SetMyField ( const Value : Integer ) ; începe FMyField := Valoare ; sfârşitul ;Declarațiile de proprietate în Ruby nu diferă de declarațiile de metodă. De exemplu, pentru a crea o proprietate duration pentru clasa Song, trebuie să descrii metodele duration și duration=(value)
clasa Song def duration @duration end def duration= ( valoare ) @duration = valoare final endCu toate acestea, un simplu acces la o variabilă obiect internă poate fi înlocuit cu un apel la metoda attr_accessor :duration
clasa Song attr_accessor :duration endMai interesant este exemplul creării unei proprietăți duration_in_minutes care va reveni sau va seta durata în minute:
class Song def duration_in_minutes @duration / 60 . 0 end def duration_in_minutes= ( valoare ) @duration = ( valoare * 60 ) . to_i sfârşitul sfârşituluiCu toate acestea, modificarea proprietății duration_in_minutes va afecta proprietatea duration. De exemplu
cântec = cântec . piesa noua . duration_in_minutes = 1 . 2 melodii tipărite . durata # va tipări 72Un set de metode cu decoratori definește modul de lucru cu o proprietate (citire, scriere, ștergere). Dacă oricare dintre metode este eliminată (cu excepția @property), capacitatea de a lucra cu proprietatea în mod corespunzător se pierde.
Un exemplu de clasă cu o proprietate:
clasa A : def __init__ ( self ): self . __x = Nici unul @property def x ( self ): return self . __X @x . setter def x ( self , value ): self . __x = valoare @x . deleter def x ( self ): sine . __x = Nici unul >>> a = A () >>> a . x >>> a . x = 2 >>> a . x 2 >>> del a . x >>> a . x >>>