Знаймо![]() приховати рекламу
| Цей текст може містити помилки. Клас (програмування)План:
ВведенняКлас - це така абстракція безлічі предметів реального світу, що
1. Класи і об'єкти, поняття екземпляра класу, поняття членів класуВ об'єктно-орієнтованої програми із застосуванням класів кожен об'єкт є "екземпляром" деякого конкретного класу, та інших об'єктів не передбачено. Тобто "екземпляр класу" в даному випадку означає не "приклад деякого класу" або "окремо взятий клас", а "об'єкт, типом якого є якийсь клас". При цьому в різних мовах програмування допускається або не допускається існування ще якихось типів даних, примірники яких не є об'єктами (тобто мова визначає, чи є об'єктами такі речі, як числа, масиви і покажчики, або не є, і, відповідно, чи є такі класи як "число", "масив" або "покажчик", екземплярами яких були б кожне конкретне число, масив або покажчик). Наприклад, абстрактний тип даних "рядок тексту" може бути оформлений у вигляді класу, і тоді всі рядки тексту в програмі будуть об'єктами - екземплярами класу "рядок тексту". При використанні класів всі елементи коду програми, такі як змінні, константи, методи, процедури та функції, можуть належати (а в багатьох мовах зобов'язані належати) того чи іншого класу. Сам клас в підсумку визначається як список своїх членів, а саме полів ( властивостей) і методів / функцій / процедур. В залежності від мови програмування до цього списку можуть додатися константи, атрибути та зовнішні визначення. Як і структури, класи можуть задавати поля - тобто змінні, що належать або безпосередньо самому класу (статичні), або екземплярів класу (звичайні). Статичні поля існують в одному примірнику на всю програму (або, в більш складному варіанті, - в одному примірнику процес або на потік / нитка). Звичайні поля створюються по одній копії для кожного конкретного об'єкта - екземпляра класу. Наприклад, загальна кількість рядків тексту, створених в програмі за час її роботи, буде статичною полем класу "рядок тексту". А конкретний масив символів рядка буде звичайним полем екземпляра класу "рядок тексту", так само як змінна "прізвище", що має тип "рядок тексту", буде звичайним полем кожного конкретного екземпляра класу "людина". В ООП при використанні класів весь виконуваний код програми (алгоритми) буде оформлятися у вигляді так званих "методів", "функцій" або "процедур", що відповідає звичайному структурному програмуванню, однак тепер вони можуть (а в багатьох мовах зобов'язані) належати того чи іншого класу. Наприклад, по можливості, клас "рядок тексту" буде містити всі основні методи / функції / процедури, призначені для роботи з рядком тексту, такі як пошук в рядку, вирізання частини рядка і т. д. Як і поля, код у вигляді методів / функцій / процедур, що належать класу, може бути віднесений або до самого класу, або до екземплярів класу. Метод, що належить класу і співвіднесений з класом (статичний метод) може бути викликаний сам по собі і має доступ до статичних змінних класу. Метод, співвіднесений з екземпляром класу (звичайний метод), може бути викликаний тільки у самого об'єкта, і має доступ як до статичних полів класу, так і до звичайних полях конкретного об'єкта (при виклику цей об'єкт передасться прихованим параметром методу). Наприклад, загальна кількість створених рядків можна дізнатися з будь-якого місця програми, але довжину конкретної рядки можна дізнатися тільки вказавши, тим чи іншим чином, довжину якої рядки будемо міряти. Сам клас не є об'єктом, проте, в залежності від мови програмування і платформи, програмісту можуть бути доступні ті чи інші об'єкти, що дозволяють отримати інформацію про клас - назва, список членів, обсяг пам'яті, займаної класом або окремим екземпляром. Наприклад, може існувати спеціальний клас "тип даних", примірники якого описують той чи інший конкретний клас, існуючий в програмі. 2. Інтерфейс і реалізація, успадкування реалізаціїУ програмуванні існує поняття програмного інтерфейсу, що означає перелік можливих обчислень, які може виконати та чи інша частина програми, включаючи опис того, які аргументи і в якому порядку потрібно передавати на вхід алгоритмам з цього переліку, а також що і в якому вигляді вони будуть повертати . Абстрактний тип даних інтерфейс придуманий для формалізованого опису такого переліку. Самі алгоритми, тобто дійсний програмний код, який буде виконувати всі ці обчислення, інтерфейсом не задається, програмується окремо і називається реалізацією інтерфейсу. Програмні інтерфейси, а також класи, можуть розширюватися шляхом успадкування, яке є одним з важливих засобів повторного використання готового коду в ООП. Успадкованих клас або інтерфейс буде містити в собі все, що зазначено для всіх його батьківських класів (залежно від мови програмування і платформи, їх може бути від нуля до нескінченності). Наприклад, можна створити свій варіант текстової рядки шляхом успадкування класу "моя рядок тексту" від вже існуючого класу "рядок тексту", при цьому передбачається, що програмісту не доведеться заново переписувати алгоритми пошуку та інше, тому що вони автоматично будуть успадковані від готового класу, і будь-який екземпляр класу "моя рядок тексту" може бути переданий не тільки в готові методи батьківського класу "рядок тексту" для проведення потрібних обчислень, а й взагалі в будь-який алгоритм, здатний працювати з об'єктами типу "рядок тексту", оскільки примірники обох класів сумісні з програмним інтерфейсам. Клас дозволяє задати не тільки програмний інтерфейс до самого себе і до своїх екземплярів, а й в явному вигляді написати код, відповідальний за обчислення. Якщо при створенні свого нового типу даних успадковувати інтерфейс, то ми отримаємо можливість передавати примірник свого типу даних в будь-який алгоритм, який вміє працювати з цим інтерфейсом. Однак нам доведеться самим написати реалізацію інтерфейсу, тобто ті алгоритми, якими буде користуватися цікавить нас алгоритм для проведення обчислень з використанням нашого екземпляра. У той же час, наслідуючи клас, ми автоматично успадковуємо готовий код під інтерфейс (це не завжди так, батьківський клас може вимагати реалізації якихось алгоритмів в дочірньому класі в обов'язковому порядку). У цій можливості успадковувати готовий код і проявляється те, що в об'єктно-орієнтованої програми тип даних клас визначає одночасно і інтерфейс, і реалізацію для всіх своїх екземплярів. 3. Стан об'єкта, поняття областей доступу, конструкториОднією з проблем структурного програмування, з якою бореться ООП, є проблема підтримки правильного значення змінних програми. Часто різні змінні програми зберігають логічно пов'язані значення, і за підтримку цієї логічної зв'язності несе відповідальність програміст, тобто автоматично зв'язність не підтримується. Прикладом можуть служити прапорці "звільнений" і "очікує премії за підсумками року", коли за правилами відділу кадрів людина може бути одночасно не звільненим і не очікують премії, не звільненим і очікують премії, звільненим і не очікують премії, але не може бути одночасно і звільненим, і очікують премії. Тобто будь-яка частина програми, яка проставляє прапорець "звільнений", завжди повинна знімати прапорець "очікує премії за підсумками року". Хороший спосіб вирішити цю проблему - оголосити прапорець "звільнений" недоступним до зміни для всіх ділянок програми, крім одного спеціально обумовленого. У цьому спеціально обумовленому ділянці все буде написано один раз і правильно, а всі інші повинні будуть звертатися до цієї ділянки завжди, коли вони хочуть встановити або зняти прапорець "звільнений". В об'єктно-орієнтованої програми прапорець "звільнений" буде оголошено приватним членом деякого класу, а для читання і зміни його будуть написані відповідні публічні методи. Правила, що визначають можливість або неможливість безпосередньо змінювати будь змінні, називаються правилами завдання областей доступу. Слова "приватний" і "публічний" в даному випадку є так званими "модифікаторами доступу". Вони називаються модифікаторами тому, що в деяких мовах вони використовуються для зміни раніше встановлених прав при спадкуванні класу. Спільно класи і модифікатори доступу задають область доступу, тобто у кожної ділянки коду, в залежності від того, якого класу він належить, буде своя область доступу щодо тих чи інших елементів (членів) свого класу та інших класів, включаючи змінні, методи, функції , константи і т. д. Існує основне правило: ніщо в одному класі не може бачити приватних елементів іншого класу. Щодо інших, більш складних правил, у різних мовах існують інші модифікатори доступу і правила їх взаємодії з класами. Майже кожному члену класу можна встановити модифікатор доступу (за винятком статичних конструкторів і деяких інших речей). У більшості об'єктно-орієнтованих мов програмування підтримуються наступні модифікатори доступу:
Проблема підтримки правильного стану змінних актуальна і для самого першого моменту виставлення початкових значень. Для цього в класах передбачені спеціальні методи / функції, звані конструкторами. Жоден об'єкт (екземпляр класу) не може бути створений інакше, як шляхом виклику на виконання коду конструктора, який поверне викликає стороні створений і правильно заповнений екземпляр класу. У багатьох мовах програмування тип даних "структура", як і клас, може містити змінні і методи, але екземпляри структур, залишаючись просто розміченим ділянкою оперативної пам'яті, можуть створюватися в обхід конструкторів, що заборонено для примірників класів (за винятком спеціальних виняткових методів обходу всіх подібних правил ООП, передбачених в деяких мовах і платформах). У цьому виявляється відмінність класів від інших типів даних - виклик конструктора обов'язковий. 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 ;
Створюється примірник (об'єкт) класу так: 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 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 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 Клас складності |