Властивість (програмування)
Властивість — спосіб доступу до внутрішнього стану об'єкта, що нагадує роботу зі змінною певного типу. Звернення до властивості об'єкта виглядає так само, як і звернення до поля структури, але, зазвичай, реалізується через виклик функції. При спробі задати значення певній властивості викликається один метод, а при спробі отримати її значення — інший.
При використанні властивостей
- можна задати значення, яке зберігатиметься, як типове (або вказати, що ніякого типового значення не передбачається);
- можна вказати, що це — властивість тільки для читання.
Як правило, властивість пов'язана з деяким внутрішнім полем об'єкта. Але властивості взагалі може не бути поставлена у відповідність жодна змінна об'єкта, хоча користувач цього об'єкта працює з нею так, ніби це — справжнє поле.
Властивості підвищують гнучкість і безпеку програмування, оскільки, як частина (відкритого) інтерфейсу, дають змогу змінювати внутрішню реалізацію об'єкта без зміни його полів. Властивості значно полегшують модифікацію програми в тих випадках, коли клас спочатку було реалізовано з порушенням інкапсуляції, а надалі потрібно змінити спосіб доступу до поля. За відсутності в мові механізму властивостей довелося б шукати і замінювати звернення до полів на виклики методів доступу.
У багатьох мовах програмування властивості реалізуються у вигляді пари методів: метод, який одержує поточне значення властивості, називається акцесор (accessor); метод, що задає нове значення властивості, — мутатор (mutator).
У мовах програмування, що не підтримують властивостей, наприклад, C++ і Java, пара з акцесора і мутатора[1] є загальноприйнятим сурогатом для їх заміни.
Називати методи властивостей заведено назвою властивості з префіксами get і set: наприклад, для властивості Xyzzy — get_Xyzzy і set_Xyzzy (традиційний стиль мови C) або GetXyzzy і SetXyzzy (стиль CamelCase). У зв'язку з цією схемою називання за методами властивостей закріпились сленгові назви getter і setter.
Властивості в C# — поля з логічним блоком, у якому є ключові слова get
і set
.
Приклад класу з властивістю:
class MyClass
{
private int p_field;
public int Field
{
get
{
return p_field;
}
private set
{
p_field = value;
}
}
}
Нижче наведено приклад реалізації властивості у 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 призначене слово 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;
class MyClass
{
private _foo : int;
public function get foo () : int {
return _foo;
}
public function set foo (foo : int) : void {
_foo = foo;
}
}
@interface Company : NSObject
{
NSString *var_name;
}
@property(retain) NSString *var_name;
@end
@implementation Company
@synthesize var_name;
@end
Опис властивості в 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
Набір методів з декораторами визначає способи роботи з властивістю (читання, запис, видалення). Якщо якийсь із методів прибрати (за винятком @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
>>>
- ↑ Accessors And Mutators In Java. C# Corner - Community of Software and Data Developers. Процитовано 5 січня 2022.