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