Об'єктно-орієнтоване програмування - студопедія
У розділі 5.1 ми говорили про те, що об'єктно-орієнтована парадигма програмування має на увазі створення активних програмних одиниць - об'єктів, які складаються з процедур, що описують, як об'єкт повинен відповідати на різні стимули. При об'єктно-орієнтованому підході до вирішення завдання визначаються необхідні об'єкти, які потім описуються як самостійні одиниці. У свою чергу об'єктно-орієнтовані мови програмування надають кошти для вираження таких ідей. В даному розділі ми познайомимося з деякими з цих коштів і тим, як вони представлені в трьох найбільш відомих об'єктно-орієнтованих мовах: C ++, Java і С #.
Розглянемо процес розробки комп'ютерної гри, в якій гравець повинен захистити Землю від падаючих метеоритів, розстрілюючи їх потужними лазерами. Кожен лазер має внутрішній запас енергії, який витрачається при пострілі. Коли запас енергії вичерпаний, лазер стає марним. Кожен лазер повинен вміти направляти промінь на ціль справа, зліва і стріляти.
Згідно об'єктно-орієнтованої парадигми кожен лазер в грі буде реалізований як об'єкт, що містить інформацію про залишився запасі енергії і процедури для наведення променя на ціль і пострілу. Оскільки властивості всіх цих об'єктів (лазерів) однакові, їх можна створювати за одним шаблоном. В об'єктно-орієнтованому програмуванні такий шаблон називається класом (class). У мовах C ++, Java і С # клас описується за допомогою наступного оператора:
де ім'я_класу - це ім'я, за яким до класу звертаються в програмі. У фігурних дужках описуються властивості класу.
Опис даних, які
знаходитимуться в кожному
об'єкті даного типу
---------1 --------- Методи, що описують,
як об'єкти даного типу
повинні відповідати void turnteft () на різні повідомлення
> Рис. 5.22. Структура класу, що описує лазерну зброю в комп'ютерній грі
Наприклад, клас LaserClass, що описує лазери в нашій комп'ютерній грі, зображений на рис. 5.22. (Більш детальний опис цього класу наводиться пізніше на рис. 5.24.) Будь-який об'єкт, створений за цим зразком, буде включати в себе
Принципи об'єктно-орієнтованого програмування використовуються при створенні загальномережевого систем програмного забезпечення. Для таких систем розробляються загальномережеві інфраструктури, за допомогою яких об'єкти можуть обмінюватися повідомленнями по мережі. Одна з технологій побудови розподілених додатків називається CORBA (Common Object Request Broker Architecture - узагальнена архітектура обробника об'єктних запитів). Вона являє собою систему інструкцій для організації передачі повідомлень між об'єктами. Інша технологія називається RMI (Remote Method Invocation - віддалений виклик методу). Ця технологія була розроблена компанією Sun Microsystems і підтримується програмним середовищем Java, (більш докладно з мовою Java ми познайомимося пізніше в цьому розділі.) Розробники програмного забезпечення, що використовують програмне середовище Java, знаходять, що технологія RMI дуже зручна при створенні об'єктів, які будуть взаємодіяти з іншими Java-об'єктами. Технологія ж CORBA зазвичай застосовується при створенні об'єктів в інших мовах програмування.
Описавши клас LaserClass, ми можемо оголосити три змінних типу LaserClass за допомогою оператора
LaserClass Laserl. Laser2. Laser3;
Зверніть увагу на те, що така ж конструкція використовується для опису трьох цілочисельних змінних х, у і z:
Обидва ці оператора складаються з імені типу і списку оголошених змінних. Різниця ж полягає в тому, що елемент, присвоєний змінної х, створюється відповідно до заздалегідь певним шаблоном цілого числа (зумовлений тип даних), в той час як елемент, присвоєний змінної Laserl, створюється згідно шаблону, визначеному в програмі як клас.
У мові C ++ в результаті виконання наведеного вище оператора будуть створені три об'єкти типу LaserClass і привласнені змінним Laserl, Laser2 і Laser3. Однак в мовах Java і С # будуть просто створені змінні, яким потім можна привласнити значення. Для того щоб створити об'єкт типу LaserCl ass і привласнити його змінної Laserl, в цих мовах потрібно використовувати оператор
LaserClass Laserl = new LaserClassO;
Такий оператор не тільки описує змінну типу LaserClass, але і створює новий об'єкт, використовуючи для цього шаблон LaserClass, і привласнює його пере-
не тільки описує тип змінної х, але і привласнює нової змінної значення 3.
Незалежно від того, з якою мовою ми працюємо, створивши об'єкти і призначивши їм імена Laserl, Laser2 і Laser3, ми можемо продовжити нашу програму, викликаючи відповідні методи цих об'єктів. Наприклад, щоб об'єкт Laserl виконав метод fire, потрібно використовувати оператор
А для того щоб об'єкт Laser2 виконав метод turnLeft, використовується оператор
Перш ніж продовжити, давайте розглянемо відношення понять класу і об'єкту. Клас являє собою шаблон, за яким створюються об'єкти: Один клас можна використовувати для створення великої кількості об'єктів. Часто об'єкт називають екземпляром класу (instance). Отже, в нашій комп'ютерній грі імена Laserl, Laser2 і Laser3 використовуються для позначення примірників класу LaserClass.
Після створення об'єкта потрібно задати деякі його характеристики. Наприклад, в нашій комп'ютерній грі лазери можуть мати різну початкову потужність. Значить, змінної примірника RemainingPower в різних об'єктах повинно бути присвоєно різний початкове значення. Ініціалізація змінних здійснюється спеціальними функціями, які називаються конструкторами (constructor). При створенні об'єкта класу вони викликаються автоматично. Конструктор задається всередині опису класу, і його ім'я збігається з ім'ям класу, до якого він належить.
Більш докладний опис класу LaserClass наведено на рис. 5.23. Зверніть увагу на те, що конструктор визначений як метод з ім'ям LaserClass. Цей метод привласнює змінної примірника RemainingPower значення, яке передається йому як параметр. Таким чином, при створенні об'єкта класу виконується цей метод, і змінної RemainingPower присвоюється необхідне значення.
Фактичні параметри, які використовує конструктор, зазвичай задаються у вигляді списку параметрів в операторі створення об'єкта. Таким чином, щоб створити два об'єкти типу LaserClass: один з ім'ям Laserl і початковою потужністю 50, а інший з ім'ям Laser2 і початковою потужністю 100, програміст C ++ напише:
LaserClass Laserl (50). Laser2 (100);
Java- і С # програміст для цієї мети скористаються операторами
LaserClass Laserl - new LaserClass (50): LaserClass Laser2 = new LaserClass (100):