- •Що таке ООП?
- •Объектно-ориентированное программирование, 11 класс
- •Объектно-ориентированное программирование, 11 класс
- •Объектно-ориентированное программирование, 11 класс
- •Объекты и классы
- •Объектно-ориентированное программирование, 11 класс
- •Объектно-ориентированное программирование, 11 класс
- •Объектно-ориентированное программирование, 11 класс
- •Объектно-ориентированное программирование, 11 класс
- •Створення об'єктів в програмі
- •Объектно-ориентированное программирование, 11 класс
- •Приховання внутрішнього устрою
- •Ієрархія класів
Ієрархія класів
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 |