Свойство (программирование): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Addbot (обсуждение | вклад)
м 8 интервики-ссылок перенесено на Викиданные, d:q2123335
Добавил PHP
Метка: редактор вики-текста 2017
 
(не показано 12 промежуточных версий 9 участников)
Строка 7: Строка 7:
*можно задать значение по умолчанию, которое будет храниться в данном свойстве (или указать, что никакого значения по умолчанию не предполагается);
*можно задать значение по умолчанию, которое будет храниться в данном свойстве (или указать, что никакого значения по умолчанию не предполагается);
*можно указать, что это свойство только для чтения.
*можно указать, что это свойство только для чтения.
Как правило, свойство связано с некоторым внутренним полем ([[Переменная (программирование)|переменной]]) объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле.
Как правило, свойство связано с некоторым внутренним [[поле класса|полем]] объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле.


Свойства повышают гибкость и безопасность программирования, поскольку, являясь частью (открытого) интерфейса, позволяют менять внутреннюю реализацию объекта без изменения его свойств. По своей сути, свойства предназначены для того, чтобы свести программирование к операциям над свойствами, скрывая вызовы методов.
Свойства повышают гибкость и безопасность программирования, поскольку, являясь частью (открытого) интерфейса, позволяют менять внутреннюю реализацию объекта без изменения его полей. Свойства значительно облегчают модификацию программы в тех случаях, когда класс изначально был реализован с нарушением [[Инкапсуляция (программирование)|инкапсуляции]], а в дальнейшем потребовалось изменить способ доступа к полю. При отсутствии в языке механизма свойств потребовалось бы искать и заменять обращения к полям на методы доступа.


== Методы свойств ==
== Методы свойств ==
Во многих [[язык программирования|языках программирования]] свойства реализуются в виде пары [[Метод (программирование)|методов]]: метод, получающий текущее значение свойства, называется ''акцессор'' (''accessor''); метод, задающий новое значение свойства — ''мутатор'' (''mutator''). В языках программирования, не поддерживающих свойства, например [[C++]] и [[Java]], пара из акцессора и мутатора является общепринятым суррогатом для их замены.
Во многих [[язык программирования|языках программирования]] свойства реализуются в виде пары [[Метод (программирование)|методов]]: метод, получающий текущее значение свойства, называется ''акцессор'' (''[[:en:accessor|accessor]]''); метод, задающий новое значение свойства, — ''мутатор'' (''[[Мутатор (программирование)|mutator]]'').{{нет АИ|27|04|2016}} В языках программирования, не поддерживающих свойства, например, [[C++]] и [[Java]], пара из акцессора и мутатора является общепринятым суррогатом для их замены.


Принято называть методы свойств именем свойства с приставками ''get'' и ''set'': например, для свойства ''Xyzzy'' — ''get_Xyzzy'' и ''set_Xyzzy'' (традиционный стиль [[Си (язык программирования)|Си]]) либо ''GetXyzzy'' и ''SetXyzzy'' (стиль [[CamelCase]]). В связи с этой схемой наименования за методами свойств закрепились жаргонные названия ''getter'' и ''setter''.
Принято называть методы свойств именем свойства с приставками ''get'' и ''set'': например, для свойства ''Xyzzy'' — ''get_Xyzzy'' и ''set_Xyzzy'' (традиционный стиль [[Си (язык программирования)|Си]]) либо ''GetXyzzy'' и ''SetXyzzy'' (стиль [[CamelCase]]). В связи с этой схемой наименования за методами свойств закрепились жаргонные названия ''getter'' и ''setter''.
Строка 121: Строка 121:
@interface Company : NSObject
@interface Company : NSObject
{
{
NSString *name;
NSString *var_name;
}
}


@property(retain) NSString *name;
@property(retain) NSString *var_name;


@end
@end
Строка 130: Строка 130:
@implementation Company
@implementation Company


@synthesize name;
@synthesize var_name;


@end
@end
Строка 169: Строка 169:
song.duration_in_minutes = 1.2
song.duration_in_minutes = 1.2
print song.duration # напечатает 72</source>
print song.duration # напечатает 72</source>

=== Свойства в Python ===

Набор методов с декораторами определяет способы работы со свойством (чтение, запись, удаление). Если какой-то из методов убрать (за исключением <code>@property</code>), теряется возможность работать со свойством соответствующим образом.

Пример класса со свойством:
<source lang=python>
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
</source>

<source lang=python>
>>> a = A()
>>> a.x
>>> a.x = 2
>>> a.x
2
>>> del a.x
>>> a.x
>>>
</source>

=== Свойства в PHP ===

Язык PHP предоставляет так называемые «магические» методы, которые перехватывают вызовы и позволяют реализовать свойства.

Пример класса со свойством:
<source lang=php>
class A
{
private int $value = 0;
public function __get(string $name): int
{
if ($name !== 'value') {
throw new Exception('Property $' . $name . ' not found');
}

return $this->value;
}
public function __set(string $name, mixed $value): void
{
if ($name !== 'value') {
throw new Exception('Property $' . $name . ' not found');
}

$this->value = $value + 10;
}
public function __isset(string $name): bool
{
return $name === 'value';
}

public function __unset(string $name): void
{
throw new Exception('Can not remove property $' . $name);
}
}
</source>

<source lang=php>
$object = new A();

$object->value = 32;
echo $object->value; // int(42)

unset($object->value); // Error: Can not remove property $value
</source>


== См. также ==
== См. также ==
Строка 176: Строка 259:
[[Категория:Концепции языков программирования]]
[[Категория:Концепции языков программирования]]
[[Категория:Объектно-ориентированное программирование]]
[[Категория:Объектно-ориентированное программирование]]
[[Категория:Статьи с примерами кода Ruby]]

Текущая версия от 20:20, 8 октября 2023

Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.

При применении свойств

  • можно задать значение по умолчанию, которое будет храниться в данном свойстве (или указать, что никакого значения по умолчанию не предполагается);
  • можно указать, что это свойство только для чтения.

Как правило, свойство связано с некоторым внутренним полем объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле.

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

Методы свойств

[править | править код]

Во многих языках программирования свойства реализуются в виде пары методов: метод, получающий текущее значение свойства, называется акцессор (accessor); метод, задающий новое значение свойства, — мутатор (mutator).[источник не указан 3022 дня] В языках программирования, не поддерживающих свойства, например, 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
>>>

Свойства в PHP

[править | править код]

Язык PHP предоставляет так называемые «магические» методы, которые перехватывают вызовы и позволяют реализовать свойства.

Пример класса со свойством:

class A
{
    private int $value = 0;
    
    public function __get(string $name): int
    {
        if ($name !== 'value') {
            throw new Exception('Property $' . $name . ' not found');
        }

        return $this->value;
    }
    
    public function __set(string $name, mixed $value): void
    {
        if ($name !== 'value') {
            throw new Exception('Property $' . $name . ' not found');
        }

        $this->value = $value + 10;
    }
    
    public function __isset(string $name): bool
    {
        return $name === 'value';
    }

    public function __unset(string $name): void
    {
        throw new Exception('Can not remove property $' . $name);
    }
}
$object = new A();

$object->value = 32;
echo $object->value; // int(42)

unset($object->value); // Error: Can not remove property $value