Властивості, методи та події.

Лекція №11

Об'єктно-орієнтоване програмування. Властивості, методи та події.

Об'єктна-орієнтоване програмування.

Об'єктно-орієнтоване, або об'єктне, програмування (надалі ООП) - парадигма програмування, в якій основними концепціями є поняття об'єктів та класів.

Історія

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

Формування КОП від ООП сталося, як сталося формування модульного від процедурного програмування: процедури сформувалися в модулі - незалежні частини коду до рівня збірки програми, так об'єкти сформувалися в компоненти - незалежні частини коду до рівня виконання програми. Взаємодія об'єктів відбувається за допомогоюповідомлень. Результатом подальшого розвитку ООП, мабуть, буде агентно-орієнтоване програмування, де агенти - незалежні частини коду на рівні виконання. Взаємодія агентів відбувається за допомогою зміни середовища, в якій вони знаходяться.

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

Першою мовою програмування, в якому були запропоновані принципи об'єктної орієнтованості, була Симула. У момент своєї появи (в 1967), ця мова програмування запропонував воістину революційні ідеї: об'єкти, класи, віртуальні методи та ін, однак це все не була сприйнята сучасниками як щось грандіозне. Тим не менше, більшість концепцій були розвинені Аланом Кейем і Деном Інгаллс в мові Smalltalk. Саме він став першим широко поширеним об'єктно-орієнтованою мовою програмування.

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

Основні поняття

Абстракція (Абстрагування) - це спосіб виділити набір значущих характеристик об'єкта, виключаючи з розгляду незначущі. Відповідно, абстракція - це набір всіх таких характеристик.

Інкапсуляція (Інкапсуляція) - це властивість системи, що дозволяє об'єднати дані і методи, що працюють з ними, в класі і приховати деталі реалізації від користувача.

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

Поліморфізм (Поліморфізм) - це властивість системи використовувати об'єкти з однаковим інтерфейсом без інформації про тип і внутрішній структурі об'єкта.

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

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

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

Об'єктно-орієнтовані мови

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

Сучасний об'єктно-орієнтована мова пропонує, як правило, наступний обов'язковий набір синтаксичних засобів:

· Оголошення класів з полями (даними - членами класу) і методами (функціями - членами класу).

· Механізм розширення класу (успадкування) - породження нового класу від існуючого з автоматичним включенням всіх особливостей реалізації класу-предка до складу класу-нащадка. Більшість ООП-мов підтримують тільки одиничне успадкування.

· Поліморфні змінні і параметри функцій (методів), що дозволяють привласнювати однієї і тієї ж змінної екземпляри різних класів.

· Поліморфну ​​поведінку екземплярів класів за рахунок використання віртуальних методів. У деяких ООП-язиках все методи класів є віртуальними.

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

· Конструктори, деструктори, фіналізатори.

· Властивості (аксессор).

· Індексатори.

· Інтерфейси (наприклад, в Java використовуються також як альтернатива множинного спадкоємства - будь-який клас може реалізувати скільки завгодно інтерфейсів).

· Перевизначення операторів для класів.

· Засоби захисту внутрішньої структури класів від несанкціонованого використання ззовні. Зазвичай це модифікатори доступу до полів і методів, типу public, private, зазвичай також protected, іноді деякі інші.

Частина мов (іноді званих "чисто об'єктними") цілком побудована навколо об'єктних засобів - у них будь-які дані (можливо, за невеликим числом винятків у вигляді вбудованих скалярних типів даних) є об'єктами, будь-який код - методом якого класу, і неможливо написати програму , в якій не використовувалися б об'єкти. Приклади подібних мов - Smalltalk, Python, Java, C #, Ruby, AS3. Інші мови (іноді використовується термін "гібридні") включають ООП-підсистему в початково процедурний мова. У них існує можливість програмувати, не звертаючись до об'єктним засобам. Класичні приклади - C + +, Delphi і Perl.

Існування ООП можливе завдяки трьом основним парадигмам на яких базується саме ООП:

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

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

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

Властивості, методи та події.

Кожен об'єкт має свій певний тип (клас), що об'єднає в собі наступні елементи:

1. Властивості певні параметри і характеристики об'єкту

2. Методи дії, що можна виконувати над даним об'єктом, чи які може виконувати він сам

3. Події повідомлення що виникають при зміні стану об'єкта

Властивості об’єкта

Властивості реалізують механізм доступу до полів. Кожній властивості відповідає поле, яке містить значення властивості, і два методи, які забезпечують доступ до даного поля. Опис властивостей починається зі слова property, при цьому тип властивості і відповідного поля повинні співпадати. Ключові слова read і write є зарезервованими всередині об’явлення властивості і служать для вказання методів класу, за допомогою яких виконується зчитування значення поля, пов’язаного з властивістю, або запис нового значення в це поле.

У контексті програми з властивістю можна працювати як зі звичайним полем.

Методи класу

Метод являє собою підпрограму (процедуру чи функцію), яка є елементом класу. Опис методу подібний до опису звичайної підпрограми модуля. Заголовок методу розміщується в описі класу, а сам код методу знаходиться у розділі реалізації. Ім’я методу у розділі реалізації є складеним і включає в себе тип класу.

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

Але метод, який об’явлений у класі, може викликатись й іншими способами, що залежать від виду цього методу. Вид методу визначається модифікатором, який вказується в описі класу після заголовку методу і відділяється від заголовка крапкою з комою. Наведемо деякі модифікатори: virtual – віртуальний метод; dynamic – динамічний метод; override – перевизначений метод; message – обробка повідомлення; abstract – абстрактний метод.

У розробника існує засіб самому керувати перевизначенням методів на етапі прогонки програми – т.зв. динамічне заміщення методів. Для цього метод, який перевизначаться в батьківському класі, визначається модифікатором virtual або dynamic. У класі-нащадку метод, який буде заміщати батьківський, визначається модифікатором override.

Отримавши директиву virtual, компілятор поміщає інформацію про метод в таблицю віртуальних методів класу (Virtual Method Table – VMT). Неважливо, скільки створено об’єктів класу, - для кожного класу створюється лише одна таблиця віртуальних методів, з якою потім береться адреса відповідного віртуального методу. У таблицю віртуальних методів поміщаються адреси усіх віртуальних методів, які унаслідуються від батьківських. Це прискорює пошук потрібного методу, але збільшує розмір таблиці.

Отримавши директиву dynamic, компілятор поміщає інформацію про метод в таблицю динамічних методів класу (Dynamic Method Table – DMT), де міститься його адреса.

Модифікатор override повідомляє компілятору, що даний метод перевизначає відповідний йому віртуальний (або динамічний) метод.

Часто вихідний метод може не виконувати ніяких дій. У цьому випадку метод називається абстрактним, і бажано, щоб в нащадках він перекривався. Для того, щоб об’явити метод абстрактним, після його заголовка і модифікатора virtual або dynamic необхідно поставити модифікатор abstract.

Повідомлення та події

Для обробки повідомлень, які посилаються ядром Windows і різними програмами, використовуються спеціальні методи, які описуються за допомогою модифікатора , після якого вказується ідентифікатор повідомлення.

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

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

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


Дата добавления: 2022-01-22; просмотров: 24; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!