Zaochniki / 07_relation
.pdfОтношения между
объектами
и реализация отношений средствами C++
Отношения в терминах ООА
Наиболее часто используемые отношения между объектами (1)
Содержит:
автомобиль содержит двигатель;
студент содержит фамилию, номер зачетки; список содержит элементы списка.
Использует:
водитель управляет машиной;
деканат принимает студента; окно рисует эллипс.
Отношения в терминах ООА
Наиболее часто используемые отношения между объектами (2)
Является разновидностью:
стриж является разновидностью птицы;
велосипед является разновидностью транспорта; квадрат есть геометрическая фигура.
Реализован посредством:
квадрат реализован с помощью прямоугольника;
танк сделан из трактора; стек реализован посредством списка.
Отношение Содержит
Реализация отношения Содержит в C++ (1)
Отношение Содержит реализуется посредством
вложения
Пример: студент содержит фамилию, номер зачетки .
c l a s s Student {
p u b l i c :
// . . .
const char getName ( ) const { r e t u r n name ; } ;
p r i v a t e :
char |
name ; |
i n t |
nz ; |
} ; |
|
Как правило, вложенные объекты находятся в закрытой (private) части класса. Для доступа к таким объектам используется интерфейс того класса, который их содержит.
Отношение Содержит
Реализация отношения Содержит в C++(2)
Пример: автомобиль содержит двигатель .
c l a s s Car {
p u b l i c :
Car ( const char mark ) ;
~Car ( ) ;
// . . .
bool on ( ) { r e t u r n motor . s t a r t ( ) ; } ; p r i v a t e :
Motor motor ;
// . . .
} ;
i n t main ( )
{
Car my_car ( "LX 300" ) ;
my_car . on ( ) ;
}
Отношение Содержит
Реализация отношения Содержит в C++(3)
Создание (инициализация) вложенных объектов происходит до создания содержащего объекта. Для передачи параметров конструктору вложенного объекта используется список инициализации. Порядок создания определяется порядком описания вложенных объектов в классе.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Car : : Car ( |
const char |
mark ) |
|
|||||||||||||||||
|
: motor ( "XV 5" ) , |
// |
это вызов |
|
|||||||||||||||||
|
|
|
// |
конструктора для motor |
|
||||||||||||||||
|
t i t l e ( mark ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ // < здесь |
все вложенные объекты |
|
|
|
|
|
|
|
|
|
||||||||||
|
// . . . |
уже созданы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отношение Содержит
Реализация отношения Содержит в C++(4)
Удаление вложенных объектов происходит после удаления содержащего объекта. Деструктор вложенных объектов вызывается автоматически. Порядок уничтожения противоположен порядку создания.
|
Car : : ~ Car ( ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// . . . . |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
// < здесь будут |
автоматически вызваны |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
// |
деструкторы |
вложенных объектов . |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отношение Использует
Реализация отношения Использует в C++
Отношение Использует реализуется посредством вызова функций из интерфейса класса.
c l a s s Student {
|
p u b l i c : |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Student ( const char nm, i n t |
anz ) ; |
|
||||||||||||||||||||
|
~Student ( ) ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i n t exam ( ) ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const |
char |
getName ( ) |
const |
{ r e t u r n name ; } ; |
|
|||||||||||||||||
|
// . . . . |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void f ( ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Student |
a ( " Vasya " , |
9103 |
) ; |
// |
создать |
|
||||||||||||||||
|
a . exam ( ) ; |
|
|
|
// |
используем exam |
|
||||||||||||||||
|
cout << |
a . getName ( ) |
<< e n d l ; |
// >> getName |
|
||||||||||||||||||
|
} < // |
здесь |
используем |
деструктор |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отношение Есть разновидность
Реализация отношения Есть разновидность в C++ (1)
Отношение Есть разновидность реализуется посредством открытого наследования.
c l a s s A {
// . . .
} ;
c l a s s B : p u b l i c A { // обозначает : класс B // открыто наследует A .
// . . .
} ;
Ключевым моментом открытого наследования является следующее утверждение:
. Класс B может дополнять класс A, но не может убирать что-либо из интерфейса или реализации A. A - базовый класс для B.
Отношение Есть разновидность
Пример: курица есть разновидность птицы .
c l a s s |
B i r d { |
|
|
|
|
|
|
|
p u b l i c : |
|
|
|
|
|
|
|
|
B i r d ( const char nm ) ; |
|
|
||||||
~ B i r d ( ) ; |
|
|
|
|
|
|
||
void |
f l y |
( ) ; |
// |
птицы летают |
|
|||
void e a t ( ) ; |
// |
è åäÿò |
|
|
||||
// . . . |
|
|
|
|
|
|
|
|
} ; |
|
|
|
|
|
|
|
|
c l a s s |
Hen |
: |
p u b l i c |
B i r d |
{ |
|
|
|
p u b l i c : |
|
|
|
|
|
|
|
|
Hen ( const |
char |
nm, |
i n t |
e2d ) ; |
||||
~Hen ( ) ; |
|
|
|
|
|
|
||
void |
f l y |
( ) ; |
|
// курица летает по своему |
||||
// åñò êàê |
обычные птицы |
íå |
определяем свою |
|||||
// |
функцию |
e a t используем из |
базового |
|||||
i n t makeEgg ( ) ; |
// + |
несет |
ÿéöà |
|
||||
// . . . |
|
|
|
|
|
|
|
} ;