Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП у (2).ppt
Скачиваний:
43
Добавлен:
30.05.2020
Размер:
4.73 Mб
Скачать

Ієрархія класів

37

К.Ю. Поляков, Е.А. Ерёмин, 2013

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Класифікації

38

 

?Що таке класифікація?

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

? Навіщо це потрібно?

Фрукт базовий клас

Яблоко

Груша

Банан

Апельсин класи-

 

 

 

нащадки

це фрукт, у якого…

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Що таке спадкоємство?

39

 

 

клас Дводольні

 

 

сімейство Боби

успадковує

рід Конюшина

гірська конюшина

властивості (має всі

 

властивості)і)

Клас Б є спадкоємцем класу А, якщо можна сказати що

Б – це різновид А.

 

 

яблуко – фрукт

яблуко – это фрукт

гірська конюшина - конюшина гірська конюшина - це

машина – двигун

рослина роду Конюшина

 

машина містить двигун (частина - ціле)

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Ієрархія логічних елементів

40

 

Логічний елемент

 

з одним входом

з двома входами

НІ

Об'єктно-орієнтоване програмування – це такий

підхід до програмування, при якому програма є безліччю тих, що взаємодіють об'єктів, кожен з яких є

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

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Базовий клас

 

41

 

 

 

ЛогЕлемент

class TLogElement

In1 (вхід 1)

{

 

 

In2 (вхід 2)

public:

 

 

Res

bool In1, In2, Res;

(результат)

void calc();

calc

};

 

 

 

обчислити

? Навіщо зберігати результат?

вихід

можна моделювати елементи з пам'яттю (тригери)

? Що погано?

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Базовий клас

42

 

class TLogElement

{

private:

bool FIn1, Fin2, FRes;

void calc(); ?

public: Чому тут? bool getIn1() { return FIn1; }

 

void setIn1 ( bool newIn1 );

 

bool getIn2() { return Fin2; }

 

void setIn2 ( bool newIn2 );

 

bool getRes() { return FRes; }

};

лише для

 

читання

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Установка входу

43

 

void TLogElement::setIn1(bool newIn1)

{

 

FIn1 = newIn1;

?

Шо ще?

 

calc();

 

 

}

перерахунок при зміні

 

 

 

входу

 

 

? Как написать процедуру calc?

 

 

void TLogElement::calc()

заглушка

{

 

 

 

}

!Проблема: спадкоємці повинні міняти calc!

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Що таке поліморфізм?

44

 

греч.: πολυ — багато, μορφη — форма

 

Поліморфізм – це можливість класів-спадкоємців по-

 

 

різному реалізувати метод, описаний для класу-

 

 

предка.

 

 

!

Проблема: відкрити дані і методи для

 

 

спадкоємців і закрити для останніх!

 

class TLogElement

 

 

{

 

 

 

...

захищені елементи:

 

 

protected

доступні лише

 

 

void

спадкоємцям

 

};

 

 

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

спадкоємці змінюватимуть поле

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Базовий клас

45

 

class TLogElement

{

private:

bool FIn1, Fin2; protected:

bool FRes;

void calc()= virtual = 0;

getIn2() { return Fin2; } void setIn2 ( bool newIn2 );

public:

bool getIn1() { return FIn1; } void setIn1 ( bool newIn1 ); bool getRes() { return FRes; }

};

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

спадкоємці змінюватимуть поле

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Базовий клас

46

 

class TLogElement

{

protected: bool FRes;

virtual void calc()= 0;

bool getIn2() { return Fin2; } void setIn2 ( bool newIn2 );

...

}; для елементів з одним входом не

(віртуальний) – потріібно!! virtual цей метод можуть

перевизначати класи-спадкоємці = 0 (абстрактний метод) – цей метод базовий клас не

реалізовуватиме (залишає спадкоємцям)

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Абстрактний клас

47

 

всі логічні елементи повинні мати метод calc

метод calc неможливо написати, поки невідомий тип логічного елементу

Абстрактний метод – це метод класу, який оголошується, але не реалізується в класі.

Абстрактний клас – це клас, що містить хоч би один абстрактний метод.

немає логічного елементу «взагалі», як не «фрукта взагалі», є конкретні види

!Не можна створити об'єкт абстрактного класу!

TLogElement абстрактний клас із-за методу calc

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Єлемент «НІ»

48

 

 

 

спадкоємець

 

 

від

 

TLogElement

class TNot: public TLogElement

{

перевизначає метод

protected:

базового класу

void calc();

 

 

};

 

 

void TNot::calc()

? Чому ні! FIn1?

{

FRes =!getIn1();

}

!Це вже не абстрактний клас!

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Єлемент «НІ»

 

49

 

 

 

Використання:

 

 

 

TNot n;

створення

 

 

 

об'єкту

установка входу

n.setIn1 ( false );

cout << n.getRes();

вивід результату

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Елементи з двома входами

50

 

 

зберегти права

нащадник від

доступу

TLogElement

class TLog2In: public TLogElement

{

public: підвищити «видимість»

(protected TLogElement::setIn2; public)

TLogElement::getIn2;

};

? Чи можна створити об'єкт цього класу

не можна, він

абстрактний

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Елементи з двома входами

51

 

class TAnd: public TLog2In

{

protected: void calc();

};

class TOr: public TLog2In

{

protected: void calc();

};

елемент «І»

елемент «АБО»

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Елементи з двома входами

52

 

void TAnd::calc()

елемент «І»

 

{

 

 

FRes = getIn1() &&

getIn2();

 

}

 

 

void TAnd::calc()

елемент «АБО»

 

{

 

FRes = getIn1() || getIn2();

}

доступ до захищеного поля (protected)

? Чому не звернутися до FIn1 і FIn2?

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Виклик віртуального методу

53

 

У базовому класі :

void TLogElement::setIn1( bool newIn1 )

{

FIn1 = newIn1; calc();

}

? Який метод викликається?

class TLogElement

{

protected:

virtual void calc()= 0;

...

};

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Віртуальний метод

54

 

Статичне зв'язування :

 

транслятор

в код адреса процедури

 

Динамічне зв'язування :

адреса процедури визначається під час виконання програми в залежності від типу об'єкта

Віртуальний метод – це метод базового класу, який можуть перевизначити класи-спадкоємці так, що конкретну адресу викликається методу визначається тільки при виконанні програми.

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Приклад: елемент «І-НЕ»

55

 

 

 

 

 

 

main()

A

 

 

 

 

 

 

 

 

{

 

 

&

 

 

 

 

 

 

 

 

 

 

 

TNot elNot;

B

 

 

 

 

 

 

 

 

TAnd elAnd;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int A, B;

 

 

 

 

 

 

 

 

 

cout << " A

B !(A&B)" << endl;

 

 

 

 

 

 

cout << "-------------" << endl; for ( A = 0; A <= 1; A++ ) {

elAnd.setIn1 ( A );

for ( B = 0; B <= 1; B++ ) { elAnd.setIn2 ( B );

elNot.setIn1 ( elAnd.getRes() ); cout << " " << A << " " << B

<< " " << elNot.getRes() << endl;

}

}

}

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Модульність

56

 

Идея: выделить классы в отдельный модуль.

Інтерфейс (log_elem.h):

class TLogElement { … }

class TLog2In: public TLogElement

{ … }

class TNot: public TLogElement { … }

class TAnd: public TLog2In { … }

class TOr: public TLog2In { … }

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Модульність

57

 

Модуль (log_elem.cpp):

#include <log_elem.h>

void TLogElement::setIn1 ( bool newIn1 )

{ ... }

void TLogElement::setIn2 ( bool newIn1 )

{ ... }

void TNot::calc()

 

{ ... }

реалізація методів

void TAnd::calc()

класів

{ ... }

? Чого не вистачає?

void TOr::calc()

{ ... }

В основну програму:

 

#include <log_elem.h>

 

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Сполучення між об'єктами

58

 

!Завдання - автоматична передача сигналів по ланцюжку!

class TLogElement

{

private:

TLogElement *FNextEl;

 

int FNextIn;

адреса наступного

...

елемента в

public:

ланцюжку

void Link ( TLogElement *nextElement, int nextIn = 1 );

};

номер входу

 

 

наступного елемента

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Сполучення між об'єктами

59

 

Установка зв'язку:

void TLogElement::Link(

TLogElement *nextElement, int nextIn )

{

FNextEl = nextElement;

FNextIn = nextIn;

}

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Сполучення між об'єктами

60

 

Після зміни виходу «смикаємо» наступний елемент:

void TLogElement::setIn1 ( bool newIn1 )

{

FIn1 = newIn1;

якщо наступний

calc();

елемент

встановлений ...

if ( FNextEl )

...

 

switch ( FNextIn ) {

 

case 1:

 

FNextEl->setIn1 ( getRes() );

 

case 2:

 

FNextEl->setIn2 ( getRes() );

 

}

}

передати результат

 

на потрібний вхід

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Сполучення між об'єктами

61

 

?Як зробити, щоб спочатку FNextEl = NULL?

Новий конструктор:

TLogElement::TLogElement()

{

FNextEl = NULL;

}

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

це вже не потрібно!

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс

Сполучення між об'єктами

62

 

Зміни в основній програмі:

 

 

TNot elNot;

встановит

 

TAnd elAnd;

 

и зв'язок

 

elAnd.Link ( &elNot );

...

for ( A = 0; A <= 1; A ++ ) { elAnd.setIn1 ( A );

for ( B = 0; B <= 1; B++ ) { elAnd.setIn2( B ); elNot.setIn1(elAnd.getRes());

...

}

}

К.Ю. Поляков, Е.А. Ерёмин, 2014

http://kpolyakov.spb.ru

Соседние файлы в предмете Объектно ориентированное программирование