Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

Клас (програмування)



План:


Введення

Клас - це така абстракція безлічі предметів реального світу, що

  1. Предмети в цій множині - об'єкти мають одні і ті ж характеристики
  2. Всі об'єкти підпорядковані і узгоджені з одним і тим же набором правил і ліній поводжень

1. Класи і об'єкти, поняття екземпляра класу, поняття членів класу

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

Наприклад, абстрактний тип даних "рядок тексту" може бути оформлений у вигляді класу, і тоді всі рядки тексту в програмі будуть об'єктами - екземплярами класу "рядок тексту".

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

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

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

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

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


2. Інтерфейс і реалізація, успадкування реалізації

У програмуванні існує поняття програмного інтерфейсу, що означає перелік можливих обчислень, які може виконати та чи інша частина програми, включаючи опис того, які аргументи і в якому порядку потрібно передавати на вхід алгоритмам з цього переліку, а також що і в якому вигляді вони будуть повертати . Абстрактний тип даних інтерфейс придуманий для формалізованого опису такого переліку. Самі алгоритми, тобто дійсний програмний код, який буде виконувати всі ці обчислення, інтерфейсом не задається, програмується окремо і називається реалізацією інтерфейсу.

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

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


3. Стан об'єкта, поняття областей доступу, конструктори

Однією з проблем структурного програмування, з якою бореться ООП, є проблема підтримки правильного значення змінних програми. Часто різні змінні програми зберігають логічно пов'язані значення, і за підтримку цієї логічної зв'язності несе відповідальність програміст, тобто автоматично зв'язність не підтримується. Прикладом можуть служити прапорці "звільнений" і "очікує премії за підсумками року", коли за правилами відділу кадрів людина може бути одночасно не звільненим і не очікують премії, не звільненим і очікують премії, звільненим і не очікують премії, але не може бути одночасно і звільненим, і очікують премії. Тобто будь-яка частина програми, яка проставляє прапорець "звільнений", завжди повинна знімати прапорець "очікує премії за підсумками року".

Хороший спосіб вирішити цю проблему - оголосити прапорець "звільнений" недоступним до зміни для всіх ділянок програми, крім одного спеціально обумовленого. У цьому спеціально обумовленому ділянці все буде написано один раз і правильно, а всі інші повинні будуть звертатися до цієї ділянки завжди, коли вони хочуть встановити або зняти прапорець "звільнений".

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

Майже кожному члену класу можна встановити модифікатор доступу (за винятком статичних конструкторів і деяких інших речей). У більшості об'єктно-орієнтованих мов програмування підтримуються наступні модифікатори доступу:

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

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


4. Практичний підхід

У сучасних об'єктно-орієнтованих мовах програмування (у тому числі в php, Java, C + +, Oberon, Python, Ruby, Smalltalk, Object Pascal) створення класу зводиться до написання деякої структури, яка містить набір полів і методів (серед останніх особливу роль відіграють конструктори, деструктори, фіналізатори). Практично клас може розумітися як якийсь шаблон, за яким створюються об'єкти - екземпляри даного класу. Всі екземпляри одного класу створені за одним шаблоном, тому мають один і той же набір полів і методів.


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

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

6. Види класів

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

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

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


8. Класи в мові Object Pascal (середа Delphi)

На мові Delphi клас описується наступним чином:

 TMyClass  =  class  (  TObject  )  private  {Описані в цій секції елементи не доступні ззовні (за межами класу, але доступні в межах модуля).}  {Тут зазвичай знаходяться поля класу.}  protected  {Описані в цій секції елементи доступні тільки класу і всім його нащадкам.}  public  {Описані в цій секції елементи доступні всім.}  published  {Описані в цій секції елементи доступні всім і відображаються в Object Inspector'e.}  end  ; 
  • TMyClass - ім'я класу;
  • class - ключове слово, що починає визначення класу;
  • TObject - клас-предок, якщо є спадкування;
  • private, protected, public, published - ключові слова, що позначають секції областей доступу.

Створюється примірник (об'єкт) класу так:

 MyClass  :  =  TMyClass  .  Create  ; 

Знищується так:

 FreeAndNil  (  MyClass  )  ; 

9. Класи в мові C + +

Клас у мові C + + створюється наступним чином:

 class  MyClass  :  public  ParentClass  / / ParentClass - клас-предок, якщо такий є  {  public  :  / / Елементи в цій секції доступні з будь-якої частини програми  MyClass  (  )  ;  / / Конструктор  ~ MyClass  (  )  ;  / / Деструктор  protected  :  / / Елементи в цій секції доступні з класу і його нащадків  private  :  / / Елементи в цій секції доступні тільки з класу; це область доступу за умовчанням  }  ; 

Після свого створення клас вважається повноцінним типом даних і, отже екземпляри класу створюються таким чином:

 MyClass myinstance  ; 

Звернення до членів класу:

 myinstance.  classmember 

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


10. Класи в мові C #

Класи в мові C # визначаються таким чином:

 public  class  MyClass  {  / / Член, доступний будь-якому класу програми  public  int  k  ;  / / Член, доступний будь-якому класу в тому ж модулі програми  internal  int  l  ;  / / Член, доступний будь-якому класу в тому ж модулі програми або тільки поточним класу і всім його підкласами в іншому модулі  protected  internal  int  m  ;  / / Член, доступний тільки поточного класу і всім його підкласами  protected  int  n  ;  / / Член, доступний тільки з поточного класу (за замовчуванням).  private  int  p  ;  } 

На відміну від C + + модифікатори доступу повинні вказуватися для кожного члена окремо. Анонімні класи можна визначити в методі, наприклад, так:

 public  void  DoSomething  (  )  ;  {  var person  =  new  {  Name  =  "Маргарита"  , Age  =  15  }  ;  var pet  =  new  {  Name  =  "Дуня"  , Type  =  "Черепаха"  , Owner  =  person  }  ;  Console  .  WriteLine  (  "Age of pet owner:"  +  pet  .  Owner  .  Age  )  ;  } 

11. Класи в мові Ruby

Класи в мові Ruby визначаються таким чином:

 class  MyClass  def  initialize  # Конструктор (необов'язковий)  end  public  # Ідентифікатор public необов'язковий, оскільки встановлено за умовчанням,  # Вказує на те, що наступні за ним методи доступні з будь-якого місця програми  def  public_method  # Публічний метод  end  protected  # Ідентифікатор protected вказує на те, що наступні за ним методи  # Будуть доступні тільки членам цього та дочірніх класів  def  protected_method  # Захищений метод  end  private  # Ідентифікатор private вказує на те, що наступні за ним методи  # Будуть доступні тільки членам даного класу  def  private_method  # Приватний метод  end  end 

Реалізація класу:

 object = MyClass.  new 

Знищення екземпляра класу не потрібно: воно відбувається автоматично за допомогою "збирача сміття", як тільки з пам'яті зникне остання посилання на нього.


12. Класи в мові Python

Визначення класу мовою Python за допомогою оператора class :

 class  MyClass:  def  __init__  (  self  ,  arg  )  :  "" "Конструктор" ""  self  . _arg  =  arg  # Параметр об'єкта  def  method1  (  self  ,  x  )  :  "" "Метод, що входить в інтерфейс класу" ""  def  _method2  (  self  ,  x  )  :  "" "Метод, що не входить в інтерфейс класу" ""  def  __method2  (  self  ,  x  )  :  "" "Метод доступний тільки всередині класу" ""  @  staticmethod  def  method3  (  arg1  ,  arg2  ,  ...  )  :  "" "Статичний метод, доступний для виклику як з примірників класу, так і з самого класу" ""  @  classmethod  def  method4  (  cls  ,  arg1  ,  arg2  ,  ...  )  :  "" "Метод класу, доступний для виклику як з примірників класу, так і з самого класу, з доступом до внутрішніх методам і параметрами" "" 

Реалізація класу:

 myinstance  =  MyClass  (  4  ) 

Знищення екземпляра класу в явному вигляді не потрібно, тому що в Python присутній автоматичний "збирач сміття". Проте в явному вигляді видалити посилання на об'єкт (екземпляр класу або сам клас) можна так:

 del  myinstance 

13. Класи в мові Java

Визначення класу мовою Java за допомогою оператора class :

 class  MyClass  {  String  name  =  "Example"  ;  / / "Конструктор"  public  MyClass  (  String  name  )  {  this  .  name  =  name  ;  }  / / "Метод"  public  String  getName  (  )  {  return  name  ;  }  } 

Реалізація класу:

 MyClass my  =  new  MyClass  (  "Example 2"  )  ; 

Знищення екземпляра класу відбувається за допомогою "збирача сміття" автоматично.


Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
Клас R
Клас co-NP
Клас
Клас RP
Клас NP
Клас P
Клас PP
Клас PH
Клас складності
© Усі права захищені
написати до нас