Властивість — спосіб доступу до внутрішнього стану об'єкта, що імітує змінну певного типу. Звернення до властивості об'єкта виглядає так само, як і звернення до структурного поля (в структурному програмуванні), але, в дійсності, реалізоване через виклик функції. При спробі задати значення даної властивості викликається один метод, а при спробі отримати значення даної властивості - інший.
При використанні властивостей
- можна задати значення за умовчанням, яке зберігатиметься в цій якості (або вказати, що ніякого значення за умовчанням не передбачається);
- можна вказати, що це - властивість тільки для читання.
Як правило, властивість пов'язана з деяким внутрішнім полем об'єкта. Але властивості взагалі може не бути поставлена у відповідність жодна змінна об'єкта, хоча користувач даного об'єкта працює з ним так, ніби це - справжнє поле.
Властивості підвищують гнучкість і безпеку програмування, оскільки, будучи частиною (відкритого) інтерфейсу, дозволяють змінювати внутрішню реалізацію об'єкта без зміни його властивостей. Властивості значно полегшують модифікацію програми в тих випадках, коли клас спочатку було реалізовано з порушенням інкапсуляції, а надалі потрібно змінити спосіб доступу до поля. При відсутності в мові механізму властивостей довелося б шукати і замінювати звернення до полів на методи доступу.
Методи властивостей Редагувати
У багатьох мовах програмування властивості реалізуються у вигляді пари методів: метод, який одержує поточне значення властивості, називається акцесор (accessor); метод, що задає нове значення властивості, - мутатор (mutator). У мовах програмування, що не підтримують властивостей, наприклад, C++ і Java, пара з акцесора і мутаторів є загальноприйнятим сурогатом для їх заміни.
Прийнято називати методи властивостей назвою властивості з префіксами get і set: наприклад, для властивості Xyzzy — get_Xyzzy і set_Xyzzy (традиційний стиль Сі) або 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 >>>
Див. також Редагувати
- Подія
- Метод