Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мод пз Лекція 1укр. ООП.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
262 Кб
Скачать
☆

Доступ до методів

Кожен метод має модифікатор доступу, що приймає одне з чотирьох значень: public, private, protected, internal. Модифікатором доступу за умовчанням є модифікатор private. Незалежно від значення модифікатора доступу, всі методи доступні для виклику при виконанні методу класу. Якщо методи мають модифікатор доступу private, можливо, опущений, то тоді вони доступні для виклику тільки всередині методів самого класу. Такі методи вважаються закритими. Зрозуміло, що клас, у якого всі методи закриті, абсурдний, оскільки ніхто не зміг би викликати жоден з його методів. Як правило, у класу є відкриті методи, що задають інтерфейс класу, і закриті методи. Інтерфейс - це лице класу, саме він визначає, чим клас цікавий своїм клієнтам, що він може робити, які сервіси надає клієнтам. Закриті методи складають важливу частину класу, дозволяючи клієнтам не вникати в деталі реалізації. Ці методи клієнтам класу недоступні, вони про них можуть нічого не знають, і, найголовніше, зміни в закритих методах ніяк не відображаються на клієнтах класу за умови коректної роботи відкритих методів.

Якщо деякі методи класу A повинні бути доступні для викликів у методах класу B, що є нащадком класу A, то такі методи слід забезпечити атрибутом protected. Якщо деякі методи повинні бути доступні тільки для методів класів B1, B2 і так далі, дружніх по відношенню до класу A, то такі методи слід забезпечити атрибутом internal, а всі дружні класи B помістити в один проект. Якщо деякі методи повинні бути доступні для методів будь-якого класу B, якому доступний сам клас A, то такі методи забезпечуються атрибутом public.

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

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

Той факт, що інкапсуляція дозволяє ховати інформацію від користувача, має наступні наслідки.

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

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

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

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

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

Конструктори класу

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

- Ім'я конструктора фіксоване і збігається з ім'ям класу,

- Для конструктора не задає повертаючого значення.

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

Давайте звернемося до прикладу і розглянемо створення трьох об'єктів класу Person:

Person pers1 = new Person (), pers2 = new Person ();

Person pers3 = new Person ("Петрова");

Сутності pers1, pers2, pers3 класу Person оголошуються з ініціалізацією, що задається операцією new, якій в якості аргумента передається конструктор класу Person. У класу Person кілька конструкторів - це типова практика, - відрізняються сигнатурою. В даному прикладі в першому рядку викликається конструктор без аргументів, у другому рядку для сутності pers3 викликається конструктор з одним аргументом типу string. Розберемо в деталях процес створення. Насамперед в стеку для сутностей pers створюється посилання зі значенням null. Потім в динамічній пам'яті створюється об'єкт - структура даних з полями, оголошеними класом Person. Поля об'єкта ініціалізуються значеннями за замовчуванням: посилальні поля - значенням null, арифметичні - нулями, рядкові - порожнім рядком. Цю роботу виконує конструктор за замовчуванням, який завжди викликається на початку процесу створення. Якщо поля класу оголошені з ініціалізацією, то виконується ініціалізація полів об'єкта заданими значеннями.

Якщо викликаний конструктор із аргументами, то починає виконуватися тіло цього конструктора. Як правило, при цьому відбувається ініціалізація тих полів об'єкта, значення яких передані конструктору. Так, наприклад, поле fam об'єкта pers3 отримає значення «Петрова».

На заключному етапі посилання зв'язується зі створеним об'єктом.