Программирование Часть 7 Наследование и полиморфизм.

Презентация:



Advertisements
Похожие презентации
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Advertisements

1. Определить последовательность проезда перекрестка
Проектирование архитектуры ИСО 1. UML 2 Структура определения языка 4.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Урок повторения по теме: «Сила». Задание 1 Задание 2.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
1 Переопределение операций Макаревич Л. Г.. 2 Зачем нужна перегрузка операций? class Complex { double re; double im; public: Complex(double r=0, double.
НаследованиеНаследование2 class Point { double x; double y; Color color; }; class Radius { Point center; double radius; };
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.

Лекция 3. Введение в C++ Примеры взяты из книги Брюса Эккеля Думаем на С++
Школьная форма Презентация для родительского собрания.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»
Транксрипт:

Программирование Часть 7 Наследование и полиморфизм

5. Объектно-ориентированное программирование 5.8. Наследование классов 2 Возможности, предоставляемые механизмом наследования: Добавлять в производном классе данные, которые представляет базовый класс Дополнять в производном классе функциональные возможности базового класса Модифицировать в производном классе методы базового класса Возможности, которых нет: Модифицировать в производном классе данные, представленные базовым классом (сохранив их идентификаторы)

5. Объектно-ориентированное программирование 5.8. Наследование классов 3 class CContainer float m_weight void ShowWeight() class CBox float m_length float m_width float m_height float Volume() void ShowVolume() class CCan float m_diameter float m_height float Volume() void ShowVolume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowVolume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer()

5. Объектно-ориентированное программирование 5.8. Наследование классов 4 Что происходит в порожденном классе: Поля данных и методы– члены класса наследуются от базового класса. Можно считать, что они описаны в порожденном классе. Однако, возможность доступа к ним из методов производного класса и извне этого класса определяется спецификатором доступа (private, protected, public) к членам в базовом классе и спецификатором доступа к базовому классу, задаваемому при описании производного класса. В производном классе можно добавлять свои поля – члены класса. В производном классе можно добавлять свои методы – члены класса. В производном классе можно переопределять методы базового класса (сохраняя точное совпадение с исходным прототипом, то есть количество и типы аргументов и возвращаемый тип). Исключение: если возвращаемый тип является указателем или ссылкой на базовый класс, он может быть заменен указателем или ссылкой на порождаемый класс. Если Вы в производном классе переопределили метод, доступ из него к родительскому методу можно получить, используя оператор ::

5. Объектно-ориентированное программирование 5.8. Наследование классов 5 Базовый класс Данные – члены Функции-члены Конструкторы Деструктор Перегруженная операция = Другие перегруженные операции Производный класс Данные – члены Собственные данные-члены Функции-члены Другие перегруженные операции Собственные функции-члены Собственные конструкторы Собственный деструктор нетнет Наследование членов базового класса в производном классе

5. Объектно-ориентированное программирование 5.8. Наследование классов 6 Базовый класс Private Protected Public Производный класс Управление доступом в производном классе Private Protected Public Private Protected Public Недоступны Доступны Окружение Public Доступны Недоступны Доступны Protected Недоступны Private

5. Объектно-ориентированное программирование 5.8. Наследование классов 7 class CContainer float m_weight void ShowWeight() class CBox float m_length float m_width float m_height float Volume() void ShowVolume() class CCan float m_diameter float m_height float Volume() void ShowVolume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowVolume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer()

5. Объектно-ориентированное программирование 5.8. Наследование классов 8 #pragma once using std::cout; using std::cin; using std::endl; class CContainer { protected: float m_weight; public: CContainer(float wht=1.0):m_weight(wht){cout

5. Объектно-ориентированное программирование 5.8. Наследование классов 9 #pragma once #include "container.h" class CBox : public CContainer { protected: float m_length; float m_width; float m_height; public: CBox(float wht=1, float l=1, float w=1, float h=1): m_length(l), m_width(w), m_height(h), CContainer(wht) {cout

5. Объектно-ориентированное программирование 5.8. Наследование классов 10 #pragma once #include "container.h" class CCan : public CContainer { protected: float m_diameter; float m_height; public: CCan(float wht=1, float d=1, float h=1):m_diameter(d), m_height(h), CContainer(wht) {cout

5. Объектно-ориентированное программирование 5.8. Наследование классов 11 #pragma once #include "box.h" class CCandyBox : public CBox { char* m_Pcandies; public: CCandyBox(float wht=1, float l=1, float w=1, float h=1): CBox(wht,l,w,h) {m_Pcandies = new char [40]; strcpy(m_Pcandies,"none"); cout

5. Объектно-ориентированное программирование 5.8. Наследование классов 12 #pragma once #include "box.h class CCrate: public CBox { float btl_diam(){return 0.1;} float btl_height(){return 0.25;} float box_reldens(){return 1.5;} protected: int m_nbottles; public: CCrate(int n=12) { if (n

5. Объектно-ориентированное программирование 5.8. Наследование классов 13 #pragma once #include "crate.h" class CBeerCrate: public CCrate { char* m_Pbeer; public: CBeerCrate(int n=12): CCrate(n) {m_Pbeer = new char [20]; strcpy(m_Pbeer,"none"); cout

5. Объектно-ориентированное программирование 5.8. Наследование классов 14 #include "stdafx.h" using namespace std; int main() { CBeerCrate bx1(45); CBeerCrate bx2=bx1; CBox bx3; bx3=bx2; bx1.ShowWeight(); // The weight is bx3.ShowWeight(); // The weight is bx1.ShowNbottles(); // The crate is designed for 20 bottles bx1.ShowVolume(); // The volume is bx3.ShowVolume(); // The volume is 0.05 _getch(); return 0; } Для классов CBeerCrate и CBox объемы считаются разными функциями Volume(), вызываемыми своими ShowVolume() Наоборот: bx2=bx3 недопустимо !!! Container CD Box CD Crate CD BeerCrate CD Container CC Конструкторы копирования по умолчанию BeerCrate CC Container CD Box CD

5. Объектно-ориентированное программирование 5.8. Наследование классов 15 // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #pragma once #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include // TODO: reference additional headers your program requires here #include #include "Can.h #include "BeerCrate.h"

5. Объектно-ориентированное программирование 5.8. Наследование классов 16 #include "stdafx.h" using namespace std; int main() { CBeerCrate* pbx1 = new CBeerCrate(45); CBeerCrate* pbx2 = new CBeerCrate(*pbx1); CBox* pbx3 = new CBox; pbx3=pbx2; pbx1->ShowWeight(); // The weight is pbx3->ShowWeight(); // The weight is pbx1->ShowNbottles(); // The crate is designed for 20 bottles pbx1->ShowVolume(); // The volume is pbx3->ShowVolume(); // The volume is 0.05 _getch(); delete pbx1; delete pbx2; delete pbx3; return 0; } Здесь возникнет ошибка из-за попытки вторично освободить один и тот же участок памяти Здесь мы навсегда потеряли доступ к участку памяти, выделенному new для pbx3 Container CD Box CD Crate CD BeerCrate CD Container CC Конструкторы копирования по умолчанию BeerCrate CC Container CD Box CD

5. Объектно-ориентированное программирование 5.8. Наследование классов 17 #include "stdafx.h" using namespace std; int main() { CBeerCrate* pbx1 = new CBeerCrate(45); CBeerCrate* pbx2 = new CBeerCrate(*pbx1); CBox* pbx3; pbx3=pbx2; pbx1->ShowWeight(); // The weight is pbx3->ShowWeight(); // The weight is pbx1->ShowNbottles(); // The crate is designed for 20 bottles pbx1->ShowVolume(); // The volume is pbx3->ShowVolume(); // The volume is 0.05 _getch(); delete pbx1; delete pbx2; return 0; } Наоборот: pbx2=pbx3 недопустимо !!! Для классов CBeerCrate и CBox объемы считаются разными функциями Volume(), вызываемыми своими ShowVolume() (статическое связывание) Container CD Box CD Crate CD BeerCrate CD Container CC Конструкторы копирования по умолчанию BeerCrate CC Объект не создается, конструкторы не вызываются

5. Объектно-ориентированное программирование Виртуальные функции 18 #pragma once using std::cout; using std::cin; using std::endl; class CContainer { protected: float m_weight; public: CContainer(float wht=1.0):m_weight(wht){}; ~CContainer(void){cout

5. Объектно-ориентированное программирование Виртуальные функции 19 #pragma once #include "container.h" class CBox : public CContainer { protected: float m_length; float m_width; float m_height; public: CBox(float wht=1, float l=1, float w=1, float h=1): m_length(l), m_width(w), m_height(h), CContainer(wht) {} ~CBox(void){cout

5. Объектно-ориентированное программирование Виртуальные функции 20 #pragma once #include "container.h" class CCan : public CContainer { protected: float m_diameter; float m_height; public: CCan(float wht=1, float d=1, float h=1):m_diameter(d), m_height(h), CContainer(wht) {} ~CCan(void){cout

5. Объектно-ориентированное программирование Виртуальные функции 21 #pragma once #include "box.h" class CCandyBox : public CBox { char* m_Pcandies; public: CCandyBox(float wht=1, float l=1, float w=1, float h=1):CBox(wht,l,w,h) {m_Pcandies = new char [40]; strcpy(m_Pcandies,"none");} CCandyBox(CCandyBox &r): CBox(r) {m_Pcandies = new char [40]; strcpy(m_Pcandies,r.m_Pcandies);} ~CCandyBox(void){delete [] m_Pcandies; cout

5. Объектно-ориентированное программирование Виртуальные функции 22 #pragma once #include "box.h class CCrate: public CBox { float btl_diam(){return 0.1;} float btl_height(){return 0.25;} float box_reldens(){return 1.5;} protected: int m_nbottles; public: CCrate(int n=12) { if (n

5. Объектно-ориентированное программирование Виртуальные функции 23 #pragma once #include "crate.h" class CBeerCrate: public CCrate { char* m_Pbeer; public: CBeerCrate(int n=12): CCrate(n) {m_Pbeer = new char [20]; strcpy(m_Pbeer,"none");} CBeerCrate(CBeerCrate &r): CCrate(r) {m_Pbeer = new char [20]; strcpy(m_Pbeer,r.m_Pbeer);} ~CBeerCrate(void){delete [] m_Pbeer;cout

5. Объектно-ориентированное программирование Виртуальные функции 24 #include "stdafx.h" using namespace std; int main() { CBeerCrate* pbx1 = new CBeerCrate(45); CBeerCrate* pbx2 = new CBeerCrate(*pbx1); CBox* pbx3; pbx3=pbx2; pbx1->ShowWeight(); // The weight is pbx3->ShowWeight(); // The weight is pbx1->ShowNbottles(); // The crate is designed for 20 bottles pbx1->ShowVolume(); // The volume is pbx3->ShowVolume(); // The volume is _getch(); delete pbx1; delete pbx2; return 0; } Результат виртуализации Volume() BeerCrate done Crate done Box done Container done BeerCrate done Crate done Box done Container done

5. Объектно-ориентированное программирование Виртуальные функции 25 #include "stdafx.h" using namespace std; int main() { CBeerCrate* pbx1 = new CBeerCrate(45); CBeerCrate* pbx2 = new CBeerCrate(*pbx1); CBox* pbx3; pbx3=pbx2; pbx1->ShowWeight(); // The weight is pbx3->ShowWeight(); // The weight is pbx1->ShowNbottles(); // The crate is designed for 20 bottles pbx1->ShowVolume(); // The volume is pbx3->ShowVolume(); // The volume is _getch(); delete pbx1; delete pbx3; return 0; } BeerCrate done Crate done Box done Container done Box done Container done Ошибка!!!

5. Объектно-ориентированное программирование Виртуальные функции 26 #pragma once using std::cout; using std::cin; using std::endl; class CContainer { protected: float m_weight; public: CContainer(float wht=1.0):m_weight(wht){}; virtual ~CContainer(void){cout

5. Объектно-ориентированное программирование Виртуальные функции 27 #include "stdafx.h" using namespace std; int main() { CBeerCrate* pbx1 = new CBeerCrate(45); CBeerCrate* pbx2 = new CBeerCrate(*pbx1); CBox* pbx3; pbx3=pbx2; pbx1->ShowWeight(); // The weight is pbx3->ShowWeight(); // The weight is pbx1->ShowNbottles(); // The crate is designed for 20 bottles pbx1->ShowVolume(); // The volume is pbx3->ShowVolume(); // The volume is _getch(); delete pbx1; delete pbx3; return 0; } BeerCrate done Crate done Box done Container done BeerCrate done Crate done Box done Container done Результат виртуализации деструктора

5. Объектно-ориентированное программирование Абстрактные классы 28 class CContainer float m_weight void ShowWeight() class CBox float m_length float m_width float m_height float Volume() void ShowVolume() class CCan float m_diameter float m_height float Volume() void ShowVolume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowVolume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer() Все ShowVolume () одинаковы. Однако каждая должна вызывать свою Volume()

5. Объектно-ориентированное программирование Абстрактные классы 29 class CContainer float m_weight void ShowWeight() class CBox float m_length float m_width float m_height float Volume() void ShowVolume() class CCan float m_diameter float m_height float Volume() void ShowVolume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer() Раз ShowVolume() одинаковы в дочернем и родительском классах, пусть эта функция наследуется

5. Объектно-ориентированное программирование Абстрактные классы 30 class CContainer float m_weight void ShowWeight() class CBox float m_length float m_width float m_height float Volume() void ShowVolume() class CCan float m_diameter float m_height float Volume() void ShowVolume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer() Cbox Box; CCandyBox CandyBox; Ccrate Crate; CBeerCrare BeerCrate; Статическое связывание (невиртуальные функции): Box.ShowVolume() Cbox::ShowVolume Cbox::Volume() CandyBox.ShowVolume() Cbox::ShowVolume Cbox::Volume() Crate.ShowVolume() Cbox::ShowVolume Cbox::Volume() BeerCrate.ShowVolume() Cbox::ShowVolume Cbox::Volume() Ошибка!

5. Объектно-ориентированное программирование Абстрактные классы 31 class CContainer float m_weight void ShowWeight() class CBox float m_length float m_width float m_height float Volume() void ShowVolume() class CCan float m_diameter float m_height float Volume() void ShowVolume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer() Cbox Box; CCandyBox CandyBox; CСrate Crate; CBeerCrare BeerCrate; Динамическое связывание (виртуальные функции): Box.ShowVolume() Cbox::ShowVolume Cbox::Volume() CandyBox.ShowVolume() Cbox::ShowVolume Cbox::Volume() Crate.ShowVolume() Cbox::ShowVolume CCrate::Volume() BeerCrate.ShowVolume() Cbox::ShowVolume CCrate:Volume() Теперь цепочка вызовов правильная.

5. Объектно-ориентированное программирование Абстрактные классы 32 class CContainer float m_weight void ShowWeight() class CBox float m_length float m_width float m_height float Volume() void ShowVolume() class CCan float m_diameter float m_height float Volume() void ShowVolume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer() ShowVolume() одинаковы и в классах CBox и Ccan. Неплохо бы их вынести в Ccontainer. Только функции Volume() там нет.

5. Объектно-ориентированное программирование Абстрактные классы 33 class CContainer float m_weight void ShowWeight() void ShowVolume() float Volume() class CBox float m_length float m_width float m_height float Volume() class CCan float m_diameter float m_height float Volume() class CCandyBox char * m_Pcandies [40] void SetCandies(char) void ShowCandies() class CCrate Int m_nbottles float Volume() void ShowNbottles class CBeerCrate char* m_Pbeer [40] void SetBeer(char) void ShowBeer() Volume() в CContainer – заглушка: чистая виртуальная функция.

5. Объектно-ориентированное программирование Абстрактные классы 34 #pragma once using std::cout; using std::cin; using std::endl; class CContainer { protected: float m_weight; public: CContainer(float wht=1.0):m_weight(wht){cout

5. Объектно-ориентированное программирование Абстрактные классы 35 #pragma once #include "box.h" class CCandyBox : public CBox { char* m_Pcandies; public: CCandyBox(float wht=1, float l=1, float w=1, float h=1):CBox(wht,l,w,h) {m_Pcandies = new char [40]; strcpy(m_Pcandies,"none");} CCandyBox(CCandyBox &r): CBox(r) {m_Pcandies = new char [40]; strcpy(m_Pcandies,r.m_Pcandies);} ~CCandyBox(void){delete [] m_Pcandies;}; CCandyBox& operator = (const CCandyBox& r) {if (&r !=this) strcpy_s(m_Pcandies,39,r.m_Pcandies); return *this;} virtual void SetCandies(char* c){strcpy_s(m_Pcandies,39,c);} virtual void ShowCandies(){cout

5. Объектно-ориентированное программирование Абстрактные классы 36 Подведем итоги: Если вы определяете класс, который будет использоваться в качестве базового для наследования, то вы должны объявить виртуальными те методы класса, которые могут быть переопределены в производных классах Деструкторы должны быть виртуальными, за исключением классов, которые не будут использоваться для наследования в качестве базовых Конструкторы не могут быть виртуальными, так как производный класс не наследует конструктор базового класса: конструктор производного класса использует конструктор базового класса. В производном классе можно переопределять методы базового класса (сохраняя точное совпадение с исходным прототипом, то есть количество и типы аргументов и возвращаемый тип). Исключение: если возвращаемый тип является указателем или ссылкой на базовый класс, он может быть заменен указателем или ссылкой на порождаемый класс. Для доступа к переопределенным родительским методам можно использовать оператор ::. Если в базовом классе вы перегрузили виртуальную функцию, это же следует сделать в производных классах, используя аналогичные прототипы. Перегруженные функции базового класса будут скрыты даже одним одноименным методом производного, и доступ к ним из производного класса будет закрыт. Если Вам нужно переопределить не все версии перегруженной функции, переопределяйте все, а там, где не нужны изменения, переопределение может просто вызвать такую же версию базового класса (используя ::)

5. Объектно-ориентированное программирование Отношения классов 37 Наследование не моделирует все виды отношений классов Наследование (is a - является) Пример: базовый класс – фрукт, производный класс – банан. С объектом производного класса можно делать все, что и с объектом базового класса. Моделируется с помощью механизма наследования. Включение (has a – содержит) Пример: обед содержит фрукт (фрукт не наследуется от обеда, обед его содержит). Такое отношение моделируется путем включения объекта класса «фрукт» в качестве члена класса «обед» Реализация (is implemented as a – реализован как) Пример: комплексное число реализовано в виде структуры. Правильно будет не наследовать класс комплексных чисел от структуры, а скрыть его реализацию путем предоставления структуры как приватного члена класса комплексных чисел. Использование (uses a - используется) Пример: компьютер использует принтер. Моделируется путем разработки дружественных функций и классов. Подобие (is like a – подобный) Пример: «всякий специалист подобен флюсу… К.Прутков» У них есть общее свойство: односторонность, которую можно выразить численно в виде некоего «коэффициента перекоса». Но у болезни масса свойств, не присущих специалисту, которые нельзя удалить из производного класса. Моделируется – созданием базового класса, включающего общие свойства, над этими двумя порожденными.

Упрощенная модель автомобильных гонок 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции m_length m_npos 13 m_ncars m_time финишфиниш m_nfinished 0 x m_maxspeed m_minspeed m_coord m_finished Speed() 10 s time quantization 38

Этапы разработки объектно-ориентированных программных систем: Объектно-ориентированный анализ: исследование задачи с точки зрения объектов реального мира и определение требований к программной системе Объектно-ориентированное проектирование: разработка программных классов и логики их функционирования и взаимодействия Объектно-ориентированное программирование: реализация классов проектирования на выбранном языке программирования. 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 39

Объектно-ориентированный анализ Подходы к анализу: Кандидаты в классы и объекты: Осязаемые предметы (автомобили, трасса, люди ) Роли (пилот, механик, зритель и т.п.) События (подготовка к старту, гонка, финиш и т.п.) Взаимодействие (передача информации о времени, состоянии трассы, текущей координаты, отображение информации о трассе и автомобилях и т.п.) 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 40

Объектно-ориентированный анализ Иерархическая классификация (определение семейного сходства): Классическая категоризация: исходя из родственности свойств 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 41 Транспортное средство ГрузовоеПассажирское Гоночное КосмическоеВоздушноеНаземное Водное МоторизованноеГужевоеМускульное АвтомобильМотоциклПоезд

Объектно-ориентированный анализ Иерархическая классификация (определение семейного сходства): Концептуальная кластеризация: вначале формируется концептуальное описание класса как кластера объектов, а затем классифицируются сущности в соответствии с этим описанием 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 42 Моторизованное транспортное средство Космический корабль СамолетКорабль ГрузовойПассажирскийГоночный Бензиновый ДизельныйЭлектромобиль АвтомобильПоезд

Объектно-ориентированный анализ Подходы к анализу: Иерархическая классификация (определение семейного сходства): Теория прототипов: начинаем с некоторой абстракции, не имеющей четкой границы и далее расширяем ее, включая все новые и новые объекты при условии фамильного сходства с прототипом(при этом наличие общий набор свойств прототипа не обязателен – важны общие свойства взаимодействия с объектами): 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 43 Повозка Рикша КаретаТроллейбус ГрузовойПассажирскийГоночный АвтомобильТрамвай

Пример наивной декомпозиции 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 44 Моторизованное транспортное средство Космический корабль СамолетКорабль Грузовой ПассажирскийГоночный Бензи- новый Дизель- ный Электро- мобиль АвтомобильПоезд Бензи- новый Дизель- ный Электро- мобиль Бензи- новый Дизель- ный Электро- мобиль

Использование композиции 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 45 Моторизованное транспортное средство Косми- ческий корабль Само- лет Ко- рабль Грузовой Пассажирский Гоночный Авто- мобиль По- езд Двигатель Внутрен- него сгорания Внешнего сгорания Электри- ческий Тепловой Бензи- новый Дизель- ный Реактив- ный Паровой

Реализация композиции 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 46 CMotor _TransportCEngine … CEngine m_MyEngine … CMotor _TransportCEngine … CEngine* m_pMyEngine …

Реализация композиции 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 47 CMotor _TransportCEngine … CEngine m_MyEngine … CMotor _Transport CEngine … CEngine* m_pMyEngine … CHeatCElectrical

Вернемся к нашей задаче 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции m_length m_npos 13 m_ncars m_time финишфиниш m_nfinished 0 x m_maxspeed m_minspeed m_coord m_finished Speed() 10 s time quantization 48

Объектно-ориентированный анализ автомобильных гонок Кандидаты в классы и объекты: Осязаемые предметы: автомобили трасса секундомер Роли владелец автомобиля пилот механик зритель События подготовка к старту гонка финиш Взаимодействие Интерфейсы 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 49

Объектно-ориентированный анализ автомобильных гонок Иерархии объектов: классическая категоризация 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 50 Транспортное средство ГрузовоеПассажирское Гоночное КосмическоеВоздушноеНаземное Водное МоторизованноеГужевоеМускульное АвтомобильМотоциклПоезд

Объектно-ориентированный анализ автомобильных гонок Иерархии объектов: концептуальная кластеризация 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 51 Дорога (пространство для движения транспортных средств) ШоссеПроселок Городская улица ЛинейнаяКольцевая Тоннель Гоночная трасса

Объектно-ориентированное проектирование для моделирования автомобильных гонок: Диаграмма использования: что должна делать система (неважно – как) 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции Пользо- ватель Создание автомобиля Задание параметров автомобиля Создание трассы Задание параметров трассы Имитация гонки > Получение отчета о гонке > Отношение направленной ассоциации > Отношение включения Размещение автомобиля на трассе 52

Объектно-ориентированное проектирование для моделирования автомобильных гонок: Конструирование классов: Отказ от иерархической системы классов (пока не умеем, а в данном случае и не нужно) Два класса должны отображать сущность и поведение гоночного автомобиля (класс CCar) и трассы со всеми ее аксессуарами (класс CTrack ) Будем придерживаться трехзвенной архитектуры объектно- ориентированных программ: 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 53 Уровень представления (user service) Классы взаимодействия окружающей среды с элементами приложения Уровень бизнес-правил (business service) Классы логики приложения (бизнес-правила) Уровень управления данными (data service) Классы управления данными

Объектно-ориентированное проектирование для моделирования автомобильных гонок: Диаграмма классов 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 54 -m_length -m_npos -m_ncars -m_nfinished -m_time -CCars** m_pcars -CTinter* m_pif CТrаск +Add (CCar*) +Go() -m_number -m_coord -m_minspeed -m_maxspeed -m_finished CCar +Move() +Getnumber() +Getcoord() +Getfinished() +Setfinished() -Speed -Ctrack* m_fnder CТinter +Showtrack() +Showcars() Отношение зависимости Отношение композиции

Объектно-ориентированное проектирование для моделирования автомобильных гонок: Построение диаграммы деятельности 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции 55 Создать трассу Трасса Создать автомобиль Автомобиль [Пока не созданы все автомобили] Поставить автомобиль на трассу [Пока не поставлены все требуемые автомобили] Переместить автомобили по трассе Отобразить автомобили на трассе Время += 10 с [Пока не финишировали все автомобили] Проводить гонку

Класс Ccars: объявление класса. Файл Car.h // File Car.h #pragma once class CCar { int m_number;// ID number of the car double m_coord;// current coordinate double m_minspeed;// mimimal possible speed km/h double m_maxspeed;// maximal possible speed km/h bool m_finished;// is the car finished public: CCar(int number=1, double minspeed=100, double maxspeed=200); ~CCar(void) {} void Move(void); // Moves the car for 10 s double Getnumber(void){return m_number;} double Getcoord(void){return m_coord;} bool Getfinished(void){return m_finished;} void Setfinished (void){m_finished=true;} private: double Speed(void); //randomly generates current speed km/h }; Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции

Класс CCars: определения методов. Файл Car.cpp // file Car.cpp #include "StdAfx.h" #include "Car.h" CCar::CCar(int number, double minspeed, double maxspeed): m_number(number), m_minspeed(minspeed),m_maxspeed(maxspeed), m_coord(0), m_finished(false) { } void CCar::Move(void) // moves the car for 10 s { m_coord=m_coord+Speed()/360.0; return; } double CCar::Speed(void) //randomly generates current speed { if (!m_finished) { int d=rand()*(m_maxspeed-m_minspeed)/RAND_MAX; return m_minspeed+d; } else return 0; } Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции

Класс CTrack: объявление класса. Файл Track.h //file Track.h #pragma once #include "Tinter.h" class CTrack { friend class CTinter; // interface class for CTrack CTinter* m_pif; // pointer to create interface object double m_length;//length of track int m_npos;//number of start positions int m_ncars;//number of cars int m_nfinished;//number of finished cars int m_time;//current time CCar** m_pcars;//pointer to create array of pointers to cars public: CTrack (int npos=1, double length=10); ~CTrack(void) {delete m_pif; delete[ ]m_pcars;} int Add (CCar* pcar);//adds one car to the track void Go (void);//provides racing }; 58 Сюда логично включить заголовочный файл класса CTinter Объявление класса CTinter как дружественного 5. Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции

Класс CTrack: определения методов. Файл Track.cpp //file Track.cpp #include "StdAfx.h" #include "Track.h CTrack::CTrack(int npos, double length): m_ncars(0), m_nfinished(0), m_time(0), m_npos (npos), m_length(length) { m_pif=new CTinter (this);//create interface object m_pcars=new CCar* [m_npos];//create tracks for(int i=1; i

Класс CTrack: определения методов. Файл Track.cpp void CTrack::Go(void) { m_pif->Showtrack(); m_pif->Showcars(); srand(static_cast (time( NULL ))); //prepare rand bool endrace=false; //not all cars finished while (!endrace) //while not all cars finished { endrace=true; for(int i=1; i= m_length) car.Setfinished(); //the car finished else endrace=false; //not all cars finished } m_time+=10; //increase time m_pif->Showcars(); } return; } Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции

Класс CTinter : объявление класса. Файл Tinter.h //file Tinter.h #pragma once class CTrack; //predeclaration of class CTrack (to declare m_fnder) class CTinter { CTrack* m_fnder; //pointer to object who has founded this object public: CTinter (CTrack* founder):m_fnder(founder){ } //we should have the pointer // to the object founded the interface ~CTinter(void) {} void Showtrack(); void Showcars(); }; Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции

Класс CTinter : определения методов. Файл Tinter.cpp //file Tinter.cpp #include "StdAfx.h" #include "Tinter.h" void CTinter::Showtrack() { std::cout

Класс CTinter : определения методов. Файл Tinter.cpp void CTinter::Showcars() { std::coutGetfinished()) if (m_fnder->m_pcars[i]->Getcoord()

Файл Stdafx.h // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #pragma once #define WIN32_LEAN_AND_MEAN// Exclude rarely-used stuff from Windows headers #include // TODO: reference additional headers your program requires here #include "Car.h" #include "Track.h" Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции

Функция main. Файл Racing1.cpp // file Racing.cpp #include "stdafx.h" using namespace std; int main() { CTrack MyTrack(5,20); //Create 20 km. track with 5 positions for cars CCar car1(1,120,190), car2(2,100,215), car3 (15,120,190); //Create 3 cars: #1, #2, #15 MyTrack.Add(&car1); // Add cars to the start position of the track MyTrack.Add(&car2); MyTrack.Add(&car3); MyTrack.Go(); // Provide racing _getch(); // Pause while not key pressed return 0; } Объектно-ориентированное программирование 5.6. Пример объектной декомпозиции