Властивість — спосіб доступу до внутрішнього стану об'єкта, що нагадує роботу зі змінною певного типу. Звернення до властивості об'єкта виглядає так само, як і звернення до поля структури, але, зазвичай, реалізується через виклик функції. При спробі задати значення певній властивості викликається один метод, а при спробі отримати її значення — інший.

При використанні властивостей можна задати значення, яке зберігатиметься, як типове (або вказати, що ніякого типового значення не передбачається); можна вказати, що це — властивість тільки для читання. Як правило, властивість пов'язана з деяким внутрішнім полем об'єкта. Але властивості взагалі може не бути поставлена у відповідність жодна змінна об'єкта, хоча користувач цього об'єкта працює з нею так, ніби це — справжнє поле.

Властивості підвищують гнучкість і безпеку програмування, оскільки, як частина (відкритого) інтерфейсу, дають змогу змінювати внутрішню реалізацію об'єкта без зміни його полів. Властивості значно полегшують модифікацію програми в тих випадках, коли клас спочатку було реалізовано з порушенням інкапсуляції, а надалі потрібно змінити спосіб доступу до поля. За відсутності в мові механізму властивостей довелося б шукати і замінювати звернення до полів на виклики методів доступу.

Методи властивостей У багатьох мовах програмування властивості реалізуються у вигляді пари методів: метод, який одержує поточне значення властивості, називається акцесор (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 >>>

Див. також Подія Метод

Примітки