Властивість (програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Версія від 13:33, 12 травня 2020, створена BunykBot (обговорення | внесок) (заміна застарілого тегу source)
Перейти до навігації Перейти до пошуку

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

При використанні властивостей

  • можна задати значення за умовчанням, яке буде зберігатися в цій якості (або вказати, що ніякого значення за умовчанням не передбачається);
  • можна вказати, що це - властивість тільки для читання.

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

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

Методи властивостей

У багатьох мовах програмування властивості реалізуються у вигляді пари методів: метод, який одержує поточне значення властивості, називається акцесор (accessor); метод, що задає нове значення властивості, - мутатор (mutator). У мовах програмування, що не підтримують властивостей, наприклад, C++ і Java, пара з акцесора і мутаторів є загальноприйнятим сурогатом для їх заміни.

Прийнято називати методи властивостей назвою властивості з префіксами get і set: наприклад, для властивості Xyzzyget_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
>>>

Див. також