You are on page 1of 14

Лекція 10

Введення в об’єктно-орієнтованого програмування

Мета: розглянути основи об’єктно-орієнтованого програмування та основні


його поняття такі, як об’єкти та класи, методи та властивості.

Сформулюємо на інтуїтивному рівні визначення таких основоположних для


об'єктно-орієнтованого підходу до програмування понять, як об'єкт, клас,
властивість і метод.
Під об'єктом будемо розуміти математичне представлення сутності
реального світу (або предметної області), яке використовується для моделювання.
Класом будемо називати загальну сутність, яка може бути визначена як
сукупність елементів (потрібно зауважити, що клас при об'єктно-орієнтованому
підході до програмування - це, як правило, первинне, невизначене поняття, до
деякої міри аналогічне теоретико-математичному поняттю множини, або, точніше,
домену).
Методом (або функцією) назвемо операцію, яка визначена над об'єктами
того чи іншого класу.
Під властивістю (або атрибутом) будемо розуміти функцію або змінну
визначену на довільному типі (даних).
Клас у об'єктно-орієнтованому підході є аналогом поняття типу в тому сенсі,
що до нього відносять лише об'єкти, відібрані за певним правилом. Поняття класу
є більш загальним, ніж поняття об'єкта. Точніше, об'єкт є екземпляром
(instantiation) класу.
Таким чином, клас може розглядатися як сукупність об'єктів (подібно до того
як множина або домен є сукупністю елементів).
У рамках об'єктно-орієнтованого підходу до програмування довільний клас
може бути елементарним або розділятися на підкласи.
1
Наприклад, більш загальний клас PERSON може містити усередині себе
підклас STUDENT, який, у свою чергу, містить конкретний об'єкт John_Smith.
Членами (або, інакше, елементами) класу мови програмування C# можуть
бути такі конструкції:
— Константа, поле, метод, оператор, конструктор, деструктор;
— Властивість, індексатор, подія;
— Статичні і початкові члени.
Доступ до членів класу визначається виходячи із значення модифікатора
області дії ідентифікатора класу, який може приймати такі значення: public,
protected, private (дане значення використовується за замовчуванням), internal,
protected internal.
Ініціалізація об'єкту класу мови програмування C# проводиться за
допомогою оператора new.
Розглянемо маніпулювання класами на прикладі наступних фрагментів
програм мовою C#.
Перш за все, наведемо найпростіше опис класу. Опис класу C з цілочисловим
полем value на мові C# має вигляд:

class C

...

int value = 0;

...

Зауважимо, що в описі класу C на мові програмування C# крім розглянутого


поля value можуть бути присутні й інші поля (тобто атрибути об'єктів класу)
допустимих в мові C# типів, а також методи (тобто способи маніпулювання
об'єктами даного класу).

2
У мові програмування C# ініціалізація поля (тобто зв'язування його з
початковим значенням) не є обов'язковою. Для забезпечення безпеки програмного
коду і через реалізацію принципу інкапсуляції, ініціалізація поля деякого класу C
не повинна відкривати можливості для доступу до полів і методів даного типу.

C c = new C ();

... c.value ...

Наведемо опис класу Rectangle, що моделює прямокутник з полями origin,


width і height, вказуючи, відповідно, початкову точку (з парою координат), ширину
і висоту, а також методом MoveTo, моделюючим переміщення початкової точки в
задану:

class Rectangle

Point origin;

public int width, height;

public Rectangle()

origin = new Point(0,0);

width=height=0;

public Rectangle(Point p, int w, int h)

origin = p;

width = w;
height = h;

public void MoveTo (Point p)

{
origin = p;

3
}

Зауважимо, що модифікатор області видимості для даного класу і його


елементів дозволяє загальнодоступне застосування (public). Розглянемо приклад
використання класу Rectangle:

Rectangle r = new Rectangle (

new Point (10,20), 5,5);

int area = r.width * r.height;

r.MoveTo (new Point (3,3));

Зауважимо, що в даному прикладі послідовно здійснюються ініціалізація


об'єкта класу Rectangle з початковою точкою (10,20), шириною і висотою в п'ять
одиниць (тобто квадрата), підрахунок його площі area і переміщення початку
відліку в точку з координатами (3, 3).
У результаті аналізу розглянутих прикладів стає очевидним, що об'єкт є
принципово динамічним і змінює стан в залежності від співвідношення (часу і
зовнішніх впливів).
У зв'язку з цим досліджуємо докладніше найпростіший, статичний випадок
полів об'єкта, який у мові програмування C# виділений в самостійний
синтаксичний елемент, який характеризується незалежністю від стану об'єкта (і
тому умовно належить до класу). Наведемо модифікований приклад попереднього
класу для випадку статичних полів:

class Rectangle

static Color defaultColor;

// Для кожного класу

static readonly int scale;

4
// Для кожного класу

int x, y, width, height;

// Для кожного об'єкта

...

Зауважимо, що статичні поля defaultColor і scale залишаються незмінними


всередині класу, тоді як динамічні поля x, y, width і height індивідуально
змінюються в залежності від стану кожного з об'єктів класу. Доступ зсередини
класу здійснюється за допомогою звернення:

... defaultColor ... scale ...

а із зовнішніх класів - за допомогою звернення:

... Rectangle.defaultColor

... Rectangle.scale ...

із зазначенням повних імен об'єктів. Оскільки статичні поля є незмінними з


часом, вони реалізуються виділенням пам'яті з статичної області.
Познайомившись з особливостями реалізації полів як елементів класів з
урахуванням динаміки і статики їх реалізації, перейдемо до розгляду способів
маніпулювання об'єктами класів, які в об'єктно-орієнтованому програмуванні
прийнято називати методами, і які, по суті, є функціями. Як і поля, методи
описуються в блоці опису класу.
Розглянемо особливості використання методів на прикладі наступної
програми на мові C#, що представляє опис класу C з полями sum і n і методами Add
і Mean:

class C

5
int sum = 0, n = 0;

public void Add (int x)

sum = sum + x; n++;

//процедура

public float Mean()

return(float)sum/n;

//функція (повинна повертати

//значення)

}
}

Перш за все, відзначимо, що методи в мові програмування C# діляться на


функції (які зобов'язані повертати значення) та процедури (які можуть і не
повертати значення, на що вказує тип void). У даному прикладі Add - процедура, а
Mean - функція, в якій повернення значення явно вказується оператором return.
Доступ до методу, як і до поля, можна отримати зсередини класу:

this.Add (3);

float x = Mean ();

а також з інших класів, з явною вказівкою повного імені:

c = new C ();

c.Add (3);

float x = c.Mean ();

Зауважимо, що оператор this являє собою вказівник на поточний об'єкт.

6
Продовжуючи аналогію між полями та методами як елементами класів, ми
приходимо до поняття статичного методу. Розглянемо особливості реалізації
статичних методів у мові програмування C# на наступному прикладі:

class Rectangle

static Color defaultColor;

public static void ResetColor ()

defaultColor = Color.white;

Як виявляється з наведеного прикладу, під статичним методом розуміється


операція над статичними елементами класів (тобто над статичними полями).
У даному прикладі опису класу Rectangle статичним є метод ResetColor
(зауважимо, що він не повертає значення, тобто ResetColor - це статична
процедура).
За аналогією з попередніми випадками, для доступу до статичного методу
зсередини класу достатньо вказати тільки коротке ім'я даного методу:

ResetColor ();

У разі доступу з сторонніх класів необхідно вказати повне ім'я статичного


методу:

Rectangle.ResetColor ();

Дослідивши особливості опису та управління поведінкою основних


елементів класів, об'єктів і методів для динамічного і статичного випадків, коротко

7
зупинимося на особливостях наслідування властивостей (полів та методів) класів
об'єктів мови програмування C#. Для ілюстрації наведемо наступний приклад
фрагмента програми на мові C#:

class Stack

int[] values;

int top = 0;

public Stack(int size)

...

public void Push(int x)

...

public int Pop()

...

У даній програмі наведено (зі скороченнями) опис класу, що моделює стек


(аналогічний стеку КАМ) за допомогою масиву елементів values з вершиною top,
функціями створення стека Stack розміром size і "виштовхування" Push елемента x
з стека, а також "внесення" Pop елемента в стек.
Аналогічно об'єктам посилальних типів, об'єкти класів (як принципово
динамічні) зберігаються в динамічній області пам'яті (або так званої "купі"). У силу
обмежень безпеки програмного коду будь-який об'єкт мови програмування C# до
використання необхідно ініціалізувати оператором new, наприклад:

8
Stack s = new Stack (100);

Зауважимо, що успадкування класами властивостей інших класів може бути


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

Класи та об'єкти

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

class імя_класу

тип_доступу тип імя_змінної1;


тип_доступу тип імя_змінної2;

...

тип_доступу повертаємий_тип

імя_методу1 (список_параметрів)

{Тіло_методу}

де тип_доступу може приймати одне з наступних значень: public, private,


protected, internal. Члени класу з типом доступу public є загальнодоступними
(тобто доступні з будь-якої точки програми за межами даного класу), з типом
доступу protected - всередині членів даного класу і його похідних, з типом доступу
10
private - тільки для інших членів даного класу. Тип доступу internal застосовується
для типів, доступних у межах однієї збірки.
Наведемо приклад опису класу:

class Animal

public string Name;

private int Weight;

protected int Type;

public int Animal (int W, int T, string N)

Weight = W;

Type = T;

Name = N;

public int GetWeight ()

return Weight;

Обєкт
Для створення об'єкта необхідно використовувати наступний синтаксис:

імя_класу імя_обєкту = new імя_класу ();

При створенні об'єкта (тобто екземпляра класу) відбувається виклик


відповідного конструктора класу.

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

імя_класу (список_параметрів)

{Тіло_конструктора}

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


знищенні об'єкта класу (безпосередньо перед початком процедури "складання
сміття"). Деструктори не мають параметрів і не повертають значень.
Синтаксис опису деструктора:

~ Імя_класу () {тіло_деструктора}

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

12
властивості, які роблять його унікальним у межах свого класу. Об'єкт може
успадковувати загальні атрибути від батьківських по відношенню до нього класів.
Синтаксис опису об'єкту:

class імя_классу: імя_батьківського_класу

тіло_класу

Приклад опису об'єкту:

class Predator: Animal


{

private int Speed;

Спадкування формує ієрархію класів на основі відношення часткового


порядку ISA ("бути").
Ієрархія може бути побудована і для об'єктів. У цьому випадку вона має
структуру, яка будується на основі відношення структурного входження ("частина-
ціле"), при якому один об'єкт є частиною іншого.

Варіанти самостійних завдань


Побудувати ієрархію класів відповідно до варіанта завдання:
1. Студент, викладач, персона, завідувач кафедрою
2. Службовець, персона, робітник, інженер
3. Робочий, кадри, інженер, адміністрація
4. Деталь, механізм, виріб, вузол
5. Організація, страхова компанія, нафтогазова компанія, завод
6. Журнал, книга, друковане видання, підручник

13
7. Тест, іспит, випускний іспит, випробування
8. Місце, область, місто, мегаполіс
9. Іграшка, продукт, товар, молочний продукт
10. Квитанція, накладна, документ, рахунок
11. Автомобіль, поїзд, транспортний засіб, експрес
12. Двигун, двигун внутрішнього згоряння, дизель, реактивний двигун
13. Республіка, монархія, королівство, держава
14. Ссавець, парнокопитне, птах, тварина
15. Корабель, пароплав, вітрильник, корвет

14

You might also like