- Свойство (программирование)
-
В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.
Эта отметка установлена 14 мая 2011.Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.
При применении свойств
- можно задать значение по умолчанию, которое будет храниться в данном свойстве (или указать, что никакого значения по умолчанию не предполагается);
- можно указать, что это свойство только для чтения.
Как правило, свойство связано с некоторым внутренним полем (переменной) объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле.
Свойства повышают гибкость и безопасность программирования, поскольку, являясь частью (открытого) интерфейса, позволяют менять внутреннюю реализацию объекта без изменения его свойств. По своей сути, свойства предназначены для того, чтобы свести программирование к операциям над свойствами, скрывая вызовы методов.
Содержание
Методы свойств
Во многих языках программирования свойства реализуются в виде пары методов: метод, получающий текущее значение свойства, называется акцессор (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 *name; } @property(retain) NSString *name; @end @implementation Company @synthesize 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
См. также
Категории:- Концепции языков программирования
- Объектно-ориентированное программирование
Wikimedia Foundation. 2010.