Властивість — спосіб доступу до внутрішнього стану об'єкта, що нагадує роботу зі змінною певного типу. Звернення до властивості об'єкта виглядає так само, як і звернення до поля структури, але, зазвичай, реалізується через виклик функції. При спробі задати значення певній властивості викликається один метод, а при спробі отримати її значення — інший.
При використанні властивостей можна задати значення, яке зберігатиметься, як типове (або вказати, що ніякого типового значення не передбачається); можна вказати, що це — властивість тільки для читання. Як правило, властивість пов'язана з деяким внутрішнім полем об'єкта. Але властивості взагалі може не бути поставлена у відповідність жодна змінна об'єкта, хоча користувач цього об'єкта працює з нею так, ніби це — справжнє поле.
Властивості підвищують гнучкість і безпеку програмування, оскільки, як частина (відкритого) інтерфейсу, дають змогу змінювати внутрішню реалізацію об'єкта без зміни його полів. Властивості значно полегшують модифікацію програми в тих випадках, коли клас спочатку було реалізовано з порушенням інкапсуляції, а надалі потрібно змінити спосіб доступу до поля. За відсутності в мові механізму властивостей довелося б шукати і замінювати звернення до полів на виклики методів доступу.
Методи властивостей У багатьох мовах програмування властивості реалізуються у вигляді пари методів: метод, який одержує поточне значення властивості, називається акцесор (accessor); метод, що задає нове значення властивості, — мутатор (mutator).
У мовах програмування, що не підтримують властивостей, наприклад, C++ і Java, пара з акцесора і мутатора є загальноприйнятим сурогатом для їх заміни.
Називати методи властивостей заведено назвою властивості з префіксами get і set: наприклад, для властивості Xyzzy — get_Xyzzy і set_Xyzzy (традиційний стиль мови C) або GetXyzzy і SetXyzzy (стиль CamelCase). У зв'язку з цією схемою називання за методами властивостей закріпились сленгові назви getter і setter.
Приклади
Властивості в C#
Властивості в C# — поля з логічним блоком, у якому є ключові слова get і set.
Приклад класу з властивістю: class MyClass { private int p_field; public int Field
get
return p_field;
private set
p_field = value;
Властивості в VB.NET Нижче наведено приклад реалізації властивості у VB.NET. Якщо потрібно реалізувати властивість тільки для читання або тільки для запису, застосовують модифікатори ReadOnly і WriteOnly. Властивість може бути параметризованою. Також вона може бути типовою властивістю, для чого необхідно додати модифікатор Default. Sub Main Dim F As New Foo
F.Data = 5 F.Item(0) = 5 F(0) = 5 'Запис у властивість Console.WriteLine(F(0)) 'Читання властивості End Sub
Public Class Foo Private m_Data As Integer Private m_Arr() As Integer = {1, 2, 3, 4, 5}
Public Property Data As Integer Set(Value As Integer) 'Сеттер m_Data = Value End Set Get Return m_Data 'Геттер End Get End Property
Public Default Property Item(Param As Integer) As Integer 'Параметризована властивість за умовчанням Set(Value As Integer) m_Arr(Param) = Value End Set Get Return m_Arr(Param) End Get End Property End Class
Властивості в Delphi
Для опису властивості в Delphi призначене слово property.
Приклад класу з властивістю: TMyClass = class private FMyField: Integer; procedure SetMyField(const Value: Integer); function GetMyField: Integer; public property MyField: Integer read GetMyField write SetMyField; end;
function TMyClass.GetMyField: Integer; begin Result := FMyField; end;
procedure TMyClass.SetMyField(const Value: Integer); begin FMyField := Value; end;
Властивості в ActionScript
class MyClass { private _foo : int;
public function get foo () : int { return _foo;
public function set foo (foo : int) : void { _foo = foo;
Властивості в Objective C @interface Company : NSObject { NSString *var_name; }
@property(retain) NSString *var_name;
@end
@implementation Company
@synthesize var_name;
@end
Властивості в Ruby
Опис властивості в Ruby нічим не відрізняється від опису методу. Наприклад, для створення властивості duration у класі Song слід описати методи duration і duration=(value) class Song def duration @duration end def duration=(value) @duration = value end end
Однак, просте звертання до внутрішньої змінної об'єкта можна замінити викликом метода attr_accessor: duration
class Song attr_accessor :duration end
Цікавішим є приклад створення властивості duration_in_minutes, яка повертатиме або встановлюватиме тривалість у хвилинах:
class Song def duration_in_minutes @duration/60.0 end def duration_in_minutes=(value) @duration = (value*60).to_i end end
В такому разі змінення властивості duration_in_minutes вплине на властивість duration. Наприклад:
song = Song.new song.duration_in_minutes = 1.2 print song.duration # надрукує 72
Властивості в Python
Набір методів з декораторами визначає способи роботи з властивістю (читання, запис, видалення). Якщо якийсь із методів прибрати (за винятком @property), втрачається можливість працювати з властивістю у відповідний спосіб.
Приклад класу з властивістю: class A: def __init__(self): self.__x = None
@property def x(self): return self.__x
@x.setter def x(self, value): self.__x = value
@x.deleter def x(self): self.__x = None
>>> a = A() >>> a.x >>> a.x = 2 >>> a.x 2 >>> del a.x >>> a.x >>>
Див. також Подія Метод
Примітки