Свойство (программирование)
Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.
Эта отметка установлена 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 .
- Сборка мусора
- Компакт-кассета
Полезное
Смотреть что такое «Свойство (программирование)» в других словарях:
- Свойство объекта — в объектно ориентированном программировании характеристика объекта. Обычно свойства изменяются с помощью методов. См. также: Объектно ориентированное программирование Финансовый словарь Финам … Финансовый словарь
- Объектно-ориентированное программирование — Эта статья во многом или полностью опирается на неавторитетные источники. Информация из таких источников не соответствует требованию проверяемости представленной информации, и такие ссылки не показывают значимость темы статьи. Статью можно… … Википедия
- Автоматное программирование — Автоматное программирование это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого либо формального автомата. В зависимости от конкретной задачи в автоматном программировании… … Википедия
- Инкапсуляция (программирование) — У этого термина существуют и другие значения, см. Инкапсуляция. В языках программирования инкапсуляция имеет одно из следующих значений, либо их комбинацию: языковой механизм ограничения доступа к определённым компонентам объекта; языковая… … Википедия
- Делегирование (программирование) — В объектно ориентированном программировании существуют два смежных понятия делегирования. В современном понимании это означает свойство языка программирования использовать правила поиска метода для диспетчеризации так называемых self calls… … Википедия
- Объектно-ориентированное программирование на Python — Объектно ориентированное программирование на Python программирование на Python с использованием парадигмы ООП: с самого начала Python проектировался как объектно ориентированный язык программирования[1]. Содержание 1 Введение 1.1 … Википедия
- Математическое программирование — математическая дисциплина, посвященная теории и методам решения задач о нахождении экстремумов функций на множествах, определяемых линейными и нелинейными ограничениями (равенствами и неравенствами). М. п. раздел науки об… … Большая советская энциклопедия
- МАТЕМАТИЧЕСКОЕ ПРОГРАММИРОВАНИЕ — математическая дисциплина, посвященная теории и методам решения задач о нахождении экстремумов функций на множествах конечномерного векторного пространства, определяемых линейными и нелинейными ограничениями (равенствами и неравенствами). М. п.… … Математическая энциклопедия
- ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ — математическая дисциплина, посвященная теории и методам решения задач об экстремумах линейных функций на множествах n мерного векторного пространства, задаваемых системами линейных неравенств и равенств; Л. п. один из разделов математического… … Математическая энциклопедия
- Объектно-ориентированное программирование на Питоне — С самого начала Питон проектировался как объектно ориентированный язык программирования [1]. Содержание 1 Введение 1.1 Принципы ООП … Википедия
- Обратная связь: Техподдержка, Реклама на сайте
- Путешествия
Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.
- Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
- Искать во всех словарях
- Искать в переводах
- Искать в ИнтернетеИскать в этой же категории
Классы, объекты, свойства и методы в ООП на PHP
Объектно-ориентированное программирование (далее ООП) — это способ программирования. Постараемся рассказать о нём простыми словами, чтобы это страшное название стало ясным и понятным. Сделаем это в формате «вопрос-ответ». Но эта статья является только ознакомительной. Её цель — дать представление об ООП.
Для чего нужно ООП? Оно нужно для упрощения. Благодаря ООП можно разбить большую задачу на более мелкие, которые легче решить. Ещё оно нужно для упрощения написания программного кода. Практически ни один большой проект не обходится без ООП.
А если «на пальцах», то в чём отличительная особенность ООП? Если Вы уже практиковались в программировании, то наверняка заметили, что чем больше становится проект, тем больше функций (function) Вы пишите. И это правильно! Такая модель программирования называется «процедурной». Но минус её в том, что постоянно приходится придумывать названия функциям, чтобы не повторяться. В ООП функции находятся внутри классов. Поэтому могут существовать несколько функций с одинаковыми названиями, но при этом они находятся внутри разных классов.
Классы — это просто набор функций? И да, и нет. Функции, которые находятся внутри классов, обзываются методами (не бойтесь этого слова — это просто название). Классы — это не только обёртки, к примеру, существует метод под название «конструктор», который вызывается при запросе любого метода, до обработки метода. Благодаря чему можно вынести, к примеру, в него проверку уровня доступа к методу, из-за чего уменьшается количество строк кода — программу становится легче читать.
Пример ООП
Представим, что у нас уже написана какая-то функция, то есть в нашем проекте в основном используется процедурная модель:
$a = Name(); // $a примет значение, которое вернёт функция Name() echo $a; ?>
Если мы перепишем этот пример через ООП, то получится такой код:
> $a = new Mouse; // $a - это новый ("new") объект класса Mouse $b = $a->Name(); // в $b будет значение, которое даст метод Name() echo $b; ?>
Посмотрите внимательно на два приведённых примера. В результате их выполнения на странице будет выведено слово «Мышь». Но в первом случае используется процедурный стиль программирования, а во втором ООП. Вы можете справедливо заметить, что код ООП намного длиннее, в нём больше строчек, он сложнее для понимания. Это правда, но если в проекте будет под 100 тысяч строк, то процедурный стиль будет настоящим кошмаром. В больших проектах лучше использовать ООП. Но при этом можно смешивать стили — это вполне законно. К примеру, вынести пару функций отдельно от всех классов.
Давайте модифицируем пример так, чтобы выгода от применения ООП была более очевидная. Для этого введём вторую функцию, которая будет возвращать не «Мышь», а «Кот». Если в примере процедурного стиля нам бы пришлось делать вторую функцию с названием «NameCat», чтобы как-то разделить две функции, то в ООП мы сделаем второй класс, но название функции оставим «Name»:
> class Cat < public function Name()< return 'Кот'; >> $a = new Mouse; // $a - это новый объект класса Mouse $b = new Cat; // $a - это новый объект класса Cat $с = $a->Name(); // запрашиваем метод Name объекта Mouse $d = $b->Name(); // запрашиваем метод Name объекта Cat echo $с . ' и ' . $d; ?>
В результате выполнения этого кода мы получим строчку:
Мышь и Кот
А теперь представьте, что у каждого класса не два метода, а двадцать, которые возвращают: возраст, цвет глаз, любимую еду, рост, вес, длину хвоста. Если программировать всё это без ООП, то будет каша в названиях функций. А если классов не два, а десяток, то процедурный тип программирования уничтожит весь проект.
Свойства в ООП
Свойства классов — это по сути переменные внутри классов, в которые можно записывать данные (но в основном их используют для задания констант). Продемонстрируем получение значения свойства и запись в него:
$a = new Mouse; // $a - это новый объект класса Mouse $a->variable = 'Кот'; // запишем в свойство "variable" строку "Кот" $b = $a->string; // запрашиваем значение свойства "string" объекта Mouse $c = $a->variable; // запрашиваем значение свойства "variable" объекта Mouse echo $b . ' и ' . $c; ?>
Значение «variable» будет храниться внутри $a (объекта класса Mouse) до тех пор, пока скрипт не закончит работу. Значение свойства «string» можно изменить так же, как и значение «variable». В результате выполнения этого кода мы получим строку:
Что такое свойство в программировании
41. Понятие об объектно-ориентированном программировании. Классы и объекты в языке Паскаль: описание, пример использования.
Понятие об объектно-ориентированном программировании.
В середине 80-х годов в программировании возникло новое направление, основанное на понятие объекта. Реальные объекты окружающего мира обладают тремя базовыми характеристиками: они имеют набор свойств, способны разными методами изменять эти свойства и реагировать на события, возникающие как в окружающем мире, так и внутри самого объекта. Именно в таком виде в языках программирования и реализовано понятие объекта, как совокупности свойств (структур данных, характерных для этого объекта), методов их обработки (подпрограмм изменения свойств) и событий, на которые данный объект может реагировать и которые приводят, как правило, к изменению свойств объекта.
Объекты могут иметь идентичную структуру и отличаться только значениями свойств. В таких случаях в программе создается новый тип, основанный на единой структуре объекта. Он называется классом, а каждый конкретный объект, имеющий структуру этого класса, называется экземпляром класса.
Объектно-ориентированный подход использует следующие базовые понятия:
– объект – совокупность свойств (параметров) определенных сущностей и методов их обработки (программных средств) (объект содержит инструкции (программный код), определяющий действия, которые может выполнять объект, и обрабатываемые данные);
– свойство объекта – характеристика объекта, его параметр;
– метод обработки – программа действий над объектом или его свойствами;
– событие – изменение состояния объекта;
– класс объектов – совокупность объектов, характеризующихся общностью применяемых методов обработки или свойств.
Объектно-ориентированный подход основан на трёх основополагающих концепциях:
– инкапсуляция;
– полиморфизм;
– наследование.
Рассмотрим эти концепции.
Важнейшая характеристика класса – возможность создания на его основе новых классов с наследованием всех его свойств и методов и добавлением собственных. Класс, не имеющий предшественника, называется базовым.
Например, класс «животное» имеет свойства «название», «размер», методы «идти» и «размножаться». Созданный на его основе класс «кошка» наследует все эти свойства и методы, к которым дополнительно добавляется свойство «окраска» и метод «пить».
Наследование позволяет создавать новые классы, повторно используя уже готовый исходный код и не тратя времени на его переписывание.
Таким образом, наследование – это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов. Например, подумайте об описании жилого дома. Дом – это часть общего класса, называемого строением. С другой стороны, строение – это часть более общего класса – конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека. В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным.
Полиморфизм – это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.
Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор.
Инкапсуляция – это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования.
В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый «чёрный ящик». Когда коды и данные объединяются таким способом, создаётся объект. Другими словами, объект – это то, что поддерживает инкапсуляцию. Внутри объекта коды и данные могут быть закрытыми. Закрытые коды или данные доступны только для других частей этого объекта.
Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта. На самом деле объект является переменной определённого пользователем типа. Может показаться странным, что объект, который объединяет коды и данные, можно рассматривать как переменную.
Свойства (Руководство по программированию в C#)
Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного поля. Свойства можно использовать, как если бы они являются общедоступными элементами данных, но они являются специальными методами, называемыми методами доступа. Эта функция позволяет легко получать доступ к данным и по-прежнему способствовать обеспечению безопасности и гибкости методов.
Общие сведения о свойствах
- Свойства позволяют классу предоставлять общий способ получения и задания значений, скрывая при этом код реализации или проверки.
- Метод доступа get используется для возврата значения свойства, а метод доступа set — для присвоения нового значения. Метод доступа к свойству init используется для назначения нового значения только во время построения объекта. Эти методы доступа могут иметь различные уровни доступа. Дополнительные сведения см. в разделе Доступность методов доступа.
- Ключевое слово value используется для определения значения, присваиваемого методом доступа set или init .
- Свойства могут быть доступны для чтения и записи (они имеют оба метода доступа — get и set ), только для чтения (они имеют метод доступа get , но не имеют метода доступа set ) или только для записи (они имеют метод доступа set , но не имеют метода доступа get ). Свойства только для записи встречаются редко и чаще всего используются для ограничения доступа к конфиденциальным данным.
- Простые свойства, не требующие пользовательского кода метода доступа, можно реализовать как определения текста выражений или как автоматически реализуемые свойства.
Свойства с резервными полями
Одной из базовых схем реализации свойств является использование закрытого резервного поля для установки и извлечения значения свойства. Метод доступа get возвращает значение закрытого поля, а метод доступа set может выполнять определенные проверки данных до присвоения значению закрытого поля. Оба метода доступа также могут выполнять некоторые преобразования или вычисления данных перед его сохранением или возвратом.
Это показано в следующем примере. В этом примере класс TimePeriod представляет интервал времени. На внутреннем уровне класс сохраняет интервал времени в секундах в закрытом поле с именем _seconds . Свойство чтения и записи с именем Hours позволяет клиенту указывать временной интервал в часах. Методы доступа get и set выполняют необходимое преобразование между часами и секундами. Кроме того, метод доступа set проверяет данные и создает ArgumentOutOfRangeException, если указано недопустимое количество часов.
public class TimePeriod < private double _seconds; public double Hours < get < return _seconds / 3600; >set < if (value < 0 || value >24) throw new ArgumentOutOfRangeException(nameof(value), "The valid range is between 0 and 24."); _seconds = value * 3600; > > >
Чтобы получить и задать значение, можно получить и задать свойства, как показано в следующем примере:
TimePeriod t = new TimePeriod(); // The property assignment causes the 'set' accessor to be called. t.Hours = 24; // Retrieving the property causes the 'get' accessor to be called. Console.WriteLine($"Time in hours: "); // The example displays the following output: // Time in hours: 24
Определения текста выражений
Как правило, методы доступа к свойствам состоят из однострочных операторов, которые просто назначают или возвращают результат выражения. Эти свойства можно реализовать как члены, воплощающие выражение. Определения текста выражений состоят из символа => , за которым идет выражение, назначаемое свойству или извлекаемое из него.
Свойства, доступные только для чтения, могут реализовать get метод доступа в качестве элемента, на основе выражения. В этом случае не используется ни ключевое слово метода доступа get , ни ключевое слово return . В следующем примере показана реализация свойства только для чтения Name в виде члена, воплощающего выражение.
public class Person < private string _firstName; private string _lastName; public Person(string first, string last) < _firstName = first; _lastName = last; >public string Name => $" "; >
И get метод set доступа могут быть реализованы как члены с выражением. В этом случае необходимо указывать ключевые слова get и set . В следующем примере показано использование определений текста выражений для обоих методов доступа. Ключевое слово return не используется с методом get доступа.
public class SaleItem < string _name; decimal _cost; public SaleItem(string name, decimal cost) < _name = name; _cost = cost; >public string Name < get =>_name; set => _name = value; > public decimal Price < get =>_cost; set => _cost = value; > >
Автоматически реализуемые свойства
В некоторых случаях свойства get и set методы доступа просто назначают значение или извлекают значение из резервного поля, не включая дополнительную логику. С помощью автоматически реализуемых свойств можно упростить код, в то время как компилятор C# будет прозрачно предоставлять вам резервное поле.
Если у свойства есть методы доступа get и set (или get и init ), они оба должны быть автоматически реализованы. Автоматически реализуемое свойство определяется с помощью ключевых слов get и set без указания какой-либо реализации. Следующий пример аналогичен предыдущему, за исключением того, что Name и Price являются автоматически реализуемыми свойствами. В этом примере также удаляется параметризованный конструктор, что позволяет инициализировать объекты SaleItem , вызывая конструктор без параметров и инициализатор объекта.
public class SaleItem < public string Name < get; set; >public decimal Price < get; set; >>
Автоматически реализованные свойства могут объявлять различные специальные возможности для get методов доступа и set доступа. Обычно вы объявляете общедоступный get метод доступа и частный set метод доступа. Дополнительные сведения см. в статье об ограничении специальных возможностей доступа.
Обязательные свойства
Начиная с C# 11, можно добавить required член, чтобы принудительно инициализировать любое свойство или поле клиентского кода:
public class SaleItem < public required string Name < get; set; >public required decimal Price < get; set; >>
Чтобы создать SaleItem объект, необходимо задать как свойства, так Name и Price свойства с помощью инициализаторов объектов, как показано в следующем коде:
var item = new SaleItem < Name = "Shoes", Price = 19.95m >; Console.WriteLine($": sells for ");
См. также
- Использование свойств
- Свойства интерфейса
- Сравнение свойств и индексаторов
- Ограничение доступности методов доступа
- Автоматически реализуемые свойства
Спецификация языка C#
Дополнительные сведения см. в разделе Свойства в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- Индексаторы
- Ключевое слово get
- Ключевое слово set
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.