Proprietate (programare)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 28 februarie 2014; verificările necesită 12 modificări .

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.

Metode de proprietate

Î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 .

Exemple

Proprietăți în C#

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 ; } } }

Proprietăți în VB.NET

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 Class

Proprietăți în Delphi

O 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 ;

Proprietăți în ActionScript

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

Proprietăți în Obiectivul C

@interface Companie  : NSObject { NSString * var_name ; } @property ( retine ) NSString * var_name ; @Sfârşit @Companie de implementare @synthesize var_name ; @Sfârşit

Proprietăți în Ruby

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 end

Cu 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 end

Mai 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şitului

Cu 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 72

Proprietăți în Python

Un 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 >>>

Vezi și