Поле класса
По́ле кла́сса или атрибу́т (переменная-член, data member, class field, instance variable) в объектно-ориентированном программировании — переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени. Обычно тип данных каждого поля задаётся в описании класса, членом которого является поле.
Поля структур
Структурные типы, поддерживаемые большинством языков программирования (называемые структурами (structure) в Си, записями (record) в Паскале и т. д.), являются частным случаем классов — а именно, классами из одних только полей. Вся информация, относящаяся к полям классов, в равной степени относится и к структурным типам.
Статические поля
Обычно, каждому объекту соответствуют собственные значения всех его полей. Также к полям класса относят статические поля (static data members, static class fields, class variables) — поля, общие для всех объектов класса.
Статические поля семантически не отличаются от обычных глобальных переменных, но они доступны только по квалифицированному имени (то есть с указанием имени класса), и поэтому, в отличие от глобальных переменных, не загромождают пространство глобальных имён.
В некоторых объектно-ориентированных языках программирования, таких как Java, не существует глобальных переменных, и поэтому статические поля классов — единственный способ хранения глобальных данных в программах на этих языках.
Битовые поля
Некоторые языки, такие как C++, позволяют определять битовые поля. Эти поля занимают менее одной единицы памяти (байт, слово); компилятор сам упаковывает несколько битовых полей в одну единицу памяти, позволяя при этом обращаться к битовым полям как к отдельным полям класса.
Понятие битовых полей не ограничивается полями классов: по аналогии оно было перенесено и на другие случаи упаковки в одну единицу памяти нескольких значений, например в сетевых протоколах и в форматах файлов.
Советы по использованию
Обычно, область доступа полей класса делают закрытой (private), то есть доступ к ним разрешается только методам того же класса. Чтобы предоставить пользователям класса значения его полей, используются свойства: они позволяют классу контролировать изменение его полей, например проверять принадлежность заданного значения диапазону допустимых значений.
Когда доступ к полю инкапсулируется процедурами свойства, возможно обновлять код, обрабатывающий изменения значения этого свойства, не нарушая совместимость с существующими пользователями класса. Поэтому, принято создавать свойства для доступа к полям класса, даже тогда, когда на начальном этапе разработки не требуется никакой дополнительной обработки присваиваемых полю значений.
Примеры использования
C++
class foo private: int x; // Это поле — закрытое. Доступ к нему возможен только // из методов класса ''foo''. public: int y; //Это поле — открытое. Доступ к нему возможен из //любого места программы. Рекомендуется так не делать. // Эти два метода ([[свойство (программирование)#Процедуры свойств|акцессор]] // и [[w:en:Mutator method|мутатор]]) обеспечивают доступ к // закрытому полю x. Рекомендуется делать именно так. int get_x() return x;>; void set_x(int x) this->x = x; >; static int z; // Это статическое поле. Оно принадлежит классу // foo целиком, а не его объектам. char a:3; // Это битовые поля. В сумме они занимают char b:3; // 8 бит, т.е. они будут размещены в одном char c:1; // байте памяти. Таким образом возможно char d:1; // обращаться к отдельным битам памяти. >;
Delphi
type foo = class private x: Integer; // закрытое поле public y: Integer; // открытое поле // для доступа к закрытому полю в Delphi можно использовать свойства function get_x: Integer; // акцессор procedure set_x (x: Integer); // мутатор property _x: Integer read get_x write set_x; // поддержка статических полей для .NET/Win32 введена в Delphi 8/2007 соответственно class var z: integer; // Это статическое поле. Оно принадлежит классу // foo целиком, а не его объектам. // в Delphi не поддерживаются битовые поля end;
Python
В Питоне поля и методы обычно называются общим термином атрибуты. Статические атрибуты могут быть перегружены в экземпляре. Атрибуты экземпляра определяются не в структуре класса, а в методах (например, конструкторе). Атрибуты, доступ к которым управляется отдельными методами, называются свойствами (синтаксически доступ к атрибутом и свойствам идентичен):
class Foo(object): z = 0 # атрибут класса (статический атрибут) def __init__(self, x, y): # конструктор self._x = x # закрытый атрибут (на уровне соглашения между программистами) self.y = y # открытый атрибут def getx(self): return self.__x # методы для чтения, def setx(self, value): self.__x = value # записи def delx(self): del self.__x # удаления свойства x = property(getx, setx, delx, "Свойство 'x'.") # определение свойства
foo = Foo(2, 4) # создание экземпляра foo.y = 10 # связывание значения с атрибутом foo.x = 30 # то же, но эквивалентно foo.setx(30) print foo.x, foo.y, foo.z # печать атрибутов del foo.x # удаление свойства print foo._x # не рекомендуется print foo.__x # не сработает
PHP
class HelloWorld private $message; // Приватное поле класса HelloWorld public $global_message; // Публичное поле // Доступ к приватному поле public function GetMessage() return $this->message; > > ?>
См. также
- Свойство (программирование)
- Класс (программирование)
- Метод (программирование)
- Объектно-ориентированное программирование
- Концепции языков программирования
Wikimedia Foundation . 2010 .
Поля (Руководство по программированию в C#)
Поле является переменной любого типа, которая объявлена непосредственно в классе или структуре. Поля являются членами содержащих их типов.
Класс или структура может иметь поля экземпляра и (или) статические поля. Поля экземпляра относятся только к экземпляру типа. При наличии класса T с полем F экземпляра можно создать два объекта типа T и изменить значение F в каждом объекте, не влияя на значение в другом объекте. Напротив, статическое поле принадлежит самому типу и является общим для всех экземпляров этого типа. Доступ к статическому полю можно получить только с помощью имени типа. Если вы обращаетесь к статическому полю по имени экземпляра, вы получите ошибки времени компиляции CS0176.
Как правило, следует объявлять private или protected специальные возможности для полей. Данные, которые тип представляет клиентскому коду, должны предоставляться через методы, свойства и индексаторы. Используя эти конструкции для косвенного доступа к внутренним полям, можно предотвратить использование недопустимых входных значений. Закрытое поле, которое хранит данные, представленные открытым свойством, называется резервным хранилищем или резервным полем. Вы можете объявлять public поля, но в этом случае нельзя запретить коду, используюющему ваш тип, задавать для этого поля недопустимое значение или иным образом изменять данные объекта.
Как правило, поля хранят данные, которые должны быть доступны нескольким методам типа и храниться дольше, чем время существования любого отдельного метода. Например, тип, представляющий календарную дату, может иметь три целочисленных поля: одно для месяца, одно для числа и одно для года. Переменные, которые не используются вне область одного метода, должны объявляться как локальные переменные в теле метода.
Поля объявляются в блоке класса или структуры путем указания уровня доступа, за которым следует тип и имя поля. Пример:
public class CalendarEntry < // private field (Located near wrapping "Date" property). private DateTime _date; // Public property exposes _date field safely. public DateTime Date < get < return _date; >set < // Set some reasonable boundaries for likely birth dates. if (value.Year >1900 && value.Year else < throw new ArgumentOutOfRangeException("Date"); >> > // public field (Generally not recommended). public string? Day; // Public method also exposes _date field safely. // Example call: birthday.SetDate("1975, 6, 30"); public void SetDate(string dateString) < DateTime dt = Convert.ToDateTime(dateString); // Set some reasonable boundaries for likely birth dates. if (dt.Year >1900 && dt.Year else < throw new ArgumentOutOfRangeException("dateString"); >> public TimeSpan GetTimeSpan(string dateString) < DateTime dt = Convert.ToDateTime(dateString); if (dt.Ticks < _date.Ticks) < return _date - dt; >else < throw new ArgumentOutOfRangeException("dateString"); >> >
Для доступа к полю в экземпляре добавьте точку после имени экземпляра, за которой следует имя поля, как в instancename._fieldName . Пример:
CalendarEntry birthday = new CalendarEntry(); birthday.Day = "Saturday";
Полю можно присвоить начальное значение с помощью оператора присваивания при объявлении поля. Чтобы автоматически назначить поле Day , например полю «Monday» , нужно объявить Day , как в следующем примере:
public class CalendarDateWithInitialization < public string Day = "Monday"; //. >
Поля инициализируются непосредственно перед вызовом конструктора для экземпляра объекта. Если конструктор присваивает значение поля, он перезаписывает любое значение, заданное во время объявления поля. Дополнительные сведения см. в разделе Использование конструкторов.
Инициализатор поля не может ссылаться на другие поля экземпляров.
Поля могут быть помечены как public , private , protected , internal , protected internal или private protected . Эти модификаторы доступа определяют, каким образом пользователи типа смогут получать доступ к полю. Дополнительные сведения см. в статье Модификаторы доступа.
При необходимости можно объявить static поле . Статические поля доступны вызывающим абонентам в любое время, даже если экземпляр типа не существует. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Поле можно объявить readonly . Полю только для чтения можно присвоить значение только во время инициализации или в конструкторе. Поле static readonly похоже на константу, за исключением того, что компилятор C# не имеет доступа к значению статического поля только для чтения во время компиляции, только во время выполнения. Дополнительные сведения см. в разделе Константы.
Поле можно объявить required . Обязательное поле должно быть инициализировано конструктором или инициализаторами объектов при создании объекта. Атрибут добавляется в System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute любое объявление конструктора, которое инициализирует все необходимые элементы.
Модификатор required нельзя сочетать с модификатором readonly в одном поле. Однако свойство может быть required только и init .
Начиная с C# 12, параметры основного конструктора являются альтернативой объявлению полей. Если тип имеет зависимости, которые должны быть предоставлены при инициализации, можно создать основной конструктор, предоставляющий эти зависимости. Эти параметры могут быть записаны и использованы вместо объявленных полей в типах. В случае типов параметры основного record конструктора отображаются в виде открытых свойств.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- Руководство по программированию на C#
- Система типов C#
- Использование конструкторов
- Наследование
- Модификаторы доступа
- Абстрактные и запечатанные классы и члены классов
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Учебники. Программирование для начинающих.
Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..
Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.
Delphi для профессионалов
Глава 1 Объектно-ориентированное программирование
Поля, свойства и методы
Поля класса являются переменными, объявленными внутри класса. Они предназначены для хранения данных во время работы экземпляра класса (объекта). Ограничений на тип полей в классе не предусмотрено. В описании класса поля должны предшествовать методам и свойствам. Обычно поля используются для обеспечения выполнения операций внутри класса.
При объявлении имен полей принято к названию добавлять заглавную букву F . Например FSomeField.
Итак, поля предназначены для использования внутри класса. Однако класс должен каким-либо образом взаимодействовать с другими классами или программными элементами приложения. В подавляющем большинстве случаев класс должен выполнить с некоторыми данными определенные действия и представить результат.
Для получения и передачи данных в классе применяются свойства. Для объявления свойств в классе используется зарезервированное слово property .
Свойства представляют собой атрибуты, которые составляют индивидуальность объекта и помогают описать его. Например, обычная кнопка в окне приложения обладает такими свойствами, как цвет, размеры, положение. Для экземпляра класса «кнопка» значения этих атрибутов задаются при помощи свойств — специальных переменных, определяемых ключевым словом property . Цвет может задаваться свойством Color , размеры — свойствами Width и Height и т. д.
Так как свойство обеспечивает обмен данными с внешней средой, то для доступа к его значению используются специальные методы класса. Поэтому обычно свойство определяется тремя элементами: полем и двумя методами, которые осуществляют его чтение/запись:
type
TAnObject = class(TObject)
function GetColor: TSomeType;
procedure SetColor(ANewValue: TSomeType);
property AColor: TSomeType read GetColor write SetColor;
end;
В данном примере доступ к значению свойства AColor осуществляется через вызовы методов GetColor и SetColor . Однако в обращении к этим методам в явном виде нет необходимости: достаточно написать:
AnObject.AColor := AValue;
AVariable := AnObject.AColor;
и компилятор самостоятельно оттранслирует обращение к свойству AColor в вызовы методов Getcolor или Setcolor . Tо есть внешне свойство выглядит в точности как обычное поле, но за всяким обращением к нему могут стоять нужные вам действия. Например, если у вас есть объект, представляющий собой квадрат на экране, и его свойству «цвет» вы присваиваете значение «белый», то произойдет немедленная перерисовка, приводящая реальный цвет на экране в соответствие со значением свойства. Выполнение этой операции осуществляется методом, который связан с установкой значения свойства «цвет».
В методах, входящих в состав свойств, может осуществляться проверка устанавливаемой величины на попадание в допустимый диапазон значений и вызов других процедур, зависящих от вносимых изменений. Если же потребности в специальных процедурах чтения и/или записи нет, можно вместо имен методов применять имена полей. Рассмотрим следующую конструкцию:
TPropObject = class(TObject)
FValue: TSomeType;
procedure DoSomething;
function Correct(AValue: Integer):boolean;
procedure SetValue(NewValue: Integer);
property AValue: Integer read FValue write SetValue;
end;
.
procedure TPropObject.SetValue(NewValue: Integer);
begin
if (NewValueoFValue) and Correct(NewValue) then EValue := NewValue;
DoSomething;
end;
В этом примере чтение значения свойства AValue означает просто чтение поля rvalue . Зато при присвоении значения внутри SetValue вызывается сразу два метода.
Если свойство должно только читаться или записываться, в его описании может присутствовать соответствующий метод:
type
TAnObject = class(TObject)
property AProperty: TSomeType read GetValue;
end;
В этом примере вне объекта значение свойства можно лишь прочитать; попытка присвоить свойству AProperty значение вызовет ошибку компиляции.
Для присвоения свойству значения по умолчанию используется ключевое слово default :
property Visible: boolean read FVisible write SetVisible default True;
Это означает, что при запуске программы свойство будет установлено компилятором в True .
Свойство может быть и векторным; в этом случае оно внешне выглядит как массив:
property APoints[Index : Integer]:TPoint read GetPoint write SetPoint;
На самом деле в классе может и не быть соответствующего поля — массива. Напомним, что вся обработка обращений к внутренним структурам класса может быть замаскирована.
Для векторного свойства необходимо описать не только тип элементов массива, но также имя и тип индекса. После ключевых слов read и write в этом случае должны стоять имена методов — использование здесь полей массивов недопустимо. Метод, читающий значение векторного свойства, должен быть описан как функция, возвращающая значение того же типа, что и элементы свойства, и имеющая единственный параметр того же типа и с тем же именем, что и индекс свойства:
Аналогично, метод, помещающий значения в такое свойство, должен первым параметром иметь индекс, а вторым — переменную нужного типа (которая может быть передана как по ссылке, так и по значению):
procedure SetPoint(Index:Integer; NewPoint:TPoint);
У векторных свойств есть еще одна важная особенность. Некоторые классы в Delphi (списки т-List, наборы строк TStrings ) «построены» вокруг основного векторного свойства (см. гл. 7). Основной метод такого класса дает доступ к некоторому массиву, а все остальные методы являются как бы вспомогательными. Специально для облегчения работы в этом случае векторное свойство может быть описано с ключевым словом default :
type
TMyObject = class;
property Strings[Index: Integer]: string read Get write Put; default;
end;
Если у объекта есть такое свойство, то можно его не упоминать, а ставить индекс в квадратных скобках сразу после имени объекта:
var AMyObject: TMyObject;
begin
.
AMyObject.Strings[1] := ‘First’;
AMyObject[2] := ‘Second’; (второй способ>
.
end.
Будьте внимательны, применяя зарезервированное слово default , — как мы увидели, для обычных и векторных свойств оно употребляется в разных случаях и с различным синтаксисом.
О роли свойств в Delphi красноречиво говорит следующий факт: у всех имеющихся в распоряжении программиста стандартных классов 100% полей недоступны и заменены базирующимися на них свойствами. Рекомендуем при разработке собственных классов придерживаться этого же правила.
Внимательный читатель обратил внимание, что при объяснении терминов «поле» и «свойство» мы использовали понятие метода, и наверняка понял его общий смысл. Итак, методом называется объявленная в классе функция или процедура, которая используется для работы с полями и свойствами класса. Согласно принципам ООП (см. разд. «Инкапсуляция» далее в этой главе), обращаться к свойствам класса можно только через его методы. От обычных процедур и функций методы отличаются тем, что им при вызове передается указатель на тот объект, который их вызвал. Поэтому обрабатываться будут данные именно того объекта, который вызвал метод. На некоторых особенностях использования методов мы остановимся ниже.
Учебники. Программирование для начинающих.
Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..
Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.
Delphi для профессионалов
Глава 13. Поля и типы данных
Поля и типы данных
Каждая таблица БД и, следовательно, каждый набор данных приложения имеет собственную структуру, которая определяется совокупностью полей. Каждое поле набора данных представляет собой объект, содержащий описание типа данных, которому должно соответствовать значение, находящееся в записи на определенном месте. Иначе, полем можно назвать совокупность ячеек с данными конкретного типа, расположенных в одном и том же месте каждой записи набора данных, или попросту — это столбец в таблице.
В наборе данных приложения баз данных Delphi каждому полю соответствует собственный объект. Основой объектов полей является класс TFieid , который инкапсулирует основные свойства абстрактного поля, не зависящего от типа данных. От этого базового класса порождены другие класса, обеспечивающие функционирование реальных объектов полей, зависящих от типа данных.
Программист, грамотно использующий возможности полей, может решать существенно более сложные задачи и создавать эффективные и гибкие приложения баз данных.
Эта глава посвящена изучению объектов полей набора данных и приемов работы с ними. В ней рассматриваются следующие вопросы:
- объект поля в наборе данных;
- динамические и статические объекты полей;
- способы использования объектов полей в наборе данных;
- класс TField — основа использования полей в наборах данных;
- типы объектов полей и типы данных;
- ограничения.