Клас

Клас

Клас - Деяка абстракція сукупності об'єктів, які мають загальний набір властивостей і мають однакову поведінку, і визначається як список своїх членів. В об'єктно-орієнтованому програмуванні, класи використовуються для групування пов'язаних змінних та функцій. Клас описує набір інкапсульованих змінних екземпляра та методів (функцій), можливо, разом з реалізацією цих типів разом з конструктором, який може використовуватись для створення екземплярів класа.


Клас є зв'язанним пакетом, який складається із спеціальних метаданих часу компіляції. Він описує правила за якими діють об'єкти; ці об'єкти називаються "екземплярами" цього класа. Клас визначає структуру даних, що містить кожний екземпляр, і, також, методи (функції) які обробляють дані екземпляра та виконують завдання; ці методи часто називають "поведінкою". Метод є функцією, що має доступ до даних об'єкта. Клас є найспецифічнішим типом даних об'єкта по відношенню до окремого прошарку. Клас може мати представлення (метаоб'єкт) під час виконання програми, який надає допомогу в роботі з метаданими класа.


Клас визначає абстрактні характеристики деякої сутності, включаючи характеристики самої сутності (її атрибути або властивості) та дії, які вона здатна виконувати (її поведінки, методи або можливості). Наприклад, клас Собака може характеризуватись рисами, притаманними всім собакам, зокрема: порода, колір хутра, здатність гавкати. Класи вносять модульність та структурованість в об'єктно-орієнтовану програму. Як правило, клас має бути зрозумілим для не-програмістів, що знаються на предметній області, що, у свою чергу, значить, що клас повинен мати значення в контексті. Також, код реалізації класу має бути досить самодостатнім. Властивості та методи класу, разом називаються його членами.

Види класів

  • Базовий (батьківський) клас
  • Похідний клас (спадкоємець, нащадок)
  • Абстрактний (віртуальний) клас

Абстрактні (abstract) методи і класи тільки оголошуються, клас який містить абстрактні методи повинен оголоситися як абстрактний. На основі абстрактного класу можна тільки створювати інші класи, а вже від них об'єкти. Абстрактний клас може містити і звичайні (не абстрактні) елементи.

Члени класів

Клас визначається як список своїх членів. До членів класу відносяться його поля (властивості) і функції (методи). Кожному члену класу можна встановити його область доступу (access control level). Область доступу члена класу визначає ділянки коду, з яких до цього члену буде можливо звертатися. У більшості об'єктно-орієнтованих мов програмування підтримуються наступні області доступу:

private (закритий, внутрішній член класу) - звернення до члена допускаються тільки з коду методів класу, в якому цей член визначений. Будь-які спадкоємці класу вже не зможуть отримати доступ до цього члену;
protected (захищений, внутрішній член ієрархії класів) - звернення до члена допускаються з коду методів класу, в якому цей член визначений, або з будь-яких його класів-спадкоємців;
public (відкритий член класу) - звернення до члена допускаються з будь-якого коду.

Область видимості

Область видимості членів класу (тобто область коду, з якої до них можна звертатися за некваліфікованого імені - без вказівки імені класу чи об'єкта) не залежить від їх області доступу, і завжди збігається з кодом методів класу.

Область видимості самого класу по-різному визначається в різними мовами програмування. В одних мовах (таких як Delphi) усі класи мають глобальну видимість (з урахуванням видимості модуля), в інших (таких як Java) область видимості класу пов'язана з змістом його одиниці компіляції (в Java - з пакетом), в третіх (таких як C + + і C #) область видимості класу визначається просторами імен (), які задаються програмістом явно і можуть співпадати або не співпадати з одиницями компіляції.

Відносини між класами

  • Спадкування (Генералізація) - об'єкти дочірнього класу успадковують всі властивості батьківського класу.
  • Асоціація - об'єкти класів вступають у взаємодію між собою.
  • Агрегація - об'єкти одного класу, входять в об'єкти іншого.
  • Композиція - об'єкти одного класу, входять в об'єкти іншого і залежать один від одного за часом життя.
  • Клас-метакласи - ставлення, при якому примірниками одного класу є інші класи.

Класи в програмних модулях

Класи дуже зручно збирати в модулі. При цьому їх опис поміщається в секцію interface, А код методів – в секцію implementation. Створюючи модулі класів, потрібно дотримуватися наступних правил:

  • всі класи, призначені для використання за межами модуля, слід визначати в секції interface;
  • опис класів, призначених для вживання усередині модуля, слід розташовувати в секції implementation;
  • якщо модуль B використовує модуль A, то в модулі B можна визначати класи, породжені від класів модуля A.

Розробка класів

Класи розробляються для досягнення певної мети. Найчастіше програміст починає з нечітко обкресленої ідеї, яка поступово, у міру розробки проекту, поповнюється деталями. Іноді справа закінчується декількома класами, вельми схожими один на одного. Щоб уникнути подібного дублювання код в класах, слід розбити їх на дві частини, визначивши загальну частину в батьківському класі, а що відрізняються залишити в похідних. Оголошення класу повинне передувати його використанню. Як правило, прикладний програміст користується готовими базовими класами, причому йому зовсім не обов'язково розбиратися у всіх специфікаціях і у внутрішній реалізації. Проте, щоб використовувати базовий клас, треба обов'язково знати які члени даних і методи доступні.

Посилання на класи

Мова Delphi дозволяє розглядати класи об'єктів як свого роду об'єкти, якими можна маніпулювати в програмі. Така можливість народжує нове поняття – клас класу; Його прийнято позначати терміном метакласи.

Для підтримки метакласи введений спеціальний тип даних – посилання на клас (class reference). Він описується за допомогою словосполучення class of, Наприклад:

type
TTextReaderClass = class of TTextReader;

Змінна типу TTextReaderClass оголошується в програмі звичайним чином:

var
ClassRef: TTextReaderClass;

Значеннями змінної ClassRef можуть бути клас TTextReader і всі породжені від нього класи. Можливі наступні оператори:

ClassRef := TTextReader;
ClassRef := TDelimitedReader;
ClassRef := TFixedReader;

За аналогією з тим, як для всіх класів існує загальний предок TObject, у посилань на класи існує базовий тип TClass, визначений, як:

type
TClass = class of TObject;

Змінна типу TClass може посилатися на будь-який клас. Практична цінність посилань на класи полягає в можливості створювати програмні модулі, що працюють з будь-якими класами об'єктів, навіть тими, які ще не розроблені.