Поле класу
Ця стаття не містить посилань на джерела. (жовтень 2017) |
Поле класу або атрибут (змінна-член, data member, class field, instance variable) в об'єктно-орієнтованому програмуванні — змінна, зв'язана з класом або об'єктом. Всі дані об'єкта зберігаються в його полях. Доступ до полів здійснюється по імені. Зазвичай тип даних кожного поля задається в описі класу, членом якого є поле. Структурні типи, підтримувані більшістю мов програмування (які називаються структурами (structure) в C, записами (record) в Pascal і т. д.), є окремим випадком класів - а саме, класами з одних тільки полів. Вся інформація, що відноситься до полів класів, в рівній мірі відноситься і до структурних типів. Зазвичай кожному об'єкту відповідають власні значення всіх його полів. Також до полів класу відносять статичні поля(static data members, static class fields, class variables) — поля, загальні для всіх об'єктів класу.
Статичні поля семантично не відрізняються від звичайних глобальних змінних, але вони доступні тільки по кваліфікованому імені (тобто із зазначенням імені класу), і тому, на відміну від глобальних змінних, не захаращують простір глобальних імен.
У деяких об'єктно-орієнтованих мовах програмування, таких як Java, не існує глобальних змінних, і тому статичні поля класів - єдиний спосіб зберігання глобальних даних в програмах на цих мовах. Деякі мови, такі як C++, дозволяють визначати бітові поля. Ці поля займають менше однієї одиниці пам'яті (байт); компілятор сам упаковує кілька бітових полів в одну одиницю пам'яті, дозволяючи при цьому звертатися до бітових полів як до окремих полів класу.
Поняття бітових полів не обмежується полями класів: за аналогією воно було перенесено і на інші випадки упаковки в одну одиницю пам'яті кількох значень, наприклад в мережевих протоколах і в форматах файлів. Зазвичай, область доступу полів класу роблять закритою (private), тобто доступ до них дозволяється тільки методам того ж класу. Щоб надати користувачам класу значення його полів, використовуються властивості: вони дозволяють класу контролювати зміна його полів, наприклад перевіряти приналежність заданого значення діапазону допустимих значень.
Коли доступ до поля інкапсулюється процедурами властивості, можливо оновлювати код, що обробляє зміни значення цієї властивості, не порушуючи сумісність з існуючими користувачами класу. Тому, прийнято створювати властивості для доступу до полів класу, навіть тоді, коли на початковому етапі розробки не потрібно ніякої додаткової обробки привласнюються полю значень.
class foo {
private:
int x; // Це поле — закрите. Доступ до нього можливий лише
// із методів класу ''foo''.
public:
int y; // Це поле — відкрите. Доступ до нього можливий із
// будь-якого місця програми. Рекомендовано так не робити.
// Ці два методи (аксесор і мутатор) забезпечують доступ до закритого поля 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; // звертатися до окремих бітів пам'яті.
};
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;
}
}
?>