Агрегация и композиция классов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Агрегация и композиция классов



 

В языке С++ в качестве свойств одного класса могут выступать объекты другого класса. Связи между классами на UML-диаграммах обозначаются стрелками:

Таблица 4.1 – Обозначение отношения классов на UML-диаграммах

 

Вид отношения Обозначение
агрегация
композиция
наследование

Агрегация имеет место, когда один класс содержит (агрегируют) объекты другого класса. Композиция похожа на агрегацию, только связь более сильная. Поэтому закрашенный ромб. То есть, если уничтожается композитор, то его объекты классов, на которые он ссылается, также перестают существовать.

Рассмотрим пример. Пусть имеется класс Point, свойства которого – координаты точки на плоскости, методы – установить и получить координаты точки. Далее нам необходимо создать класс Line, который будет характеризоваться координатами начала и конца отрезка, т.е. у класса будут два свойства – точка начала и точка окончания и методы по установке значений координат точек. Диаграмма приведена на рисунке 4.3.

 

Рисунок 2.3 – Диаграмма композиции классов.

 

Напишем программный код.

class Point {

float x, y; // координаты точки на плоскости

public:

Point() { // конструктор по умолчанию

x = 0;

y = 0;

}

Point(int x_, int y_) {// конструктор с параметрами

x = x_;

y = y_;

}

  // Методы по получению и усановке значений координат

int getX() {  return x; }

void setX(int x_) {  x = x_; }

int getY() {  return y;}

void setY(int y_) { y = y_; }

void setXY(int x_, int y_) {

x = x_;

y = y_;

}

};

class Line {// класс линия

Point begin,end;//Начальная и конечная точки, объ е кты класса Point

public:

Line(int x1, int y1, int x2, int y2) {

//конструктор по четырем координатам

begin.setXY(x1, y1); // вызов функции из класса Point

end.setXY(x2, y2);// вызов функции из класса Point

}

Line(Point begin_, Point end_) {//конструктор по двум точкам

begin = begin_;

end = end_;

}

// Методы по установке и получению значений свойств

Point getBegin() { return begin; }

Point getEnd() { return end; }

void setBegin(Point begin_){ begin = begin_; }

void setEnd(Point end_){  end = end_; }

int getBeginX() { return begin.getX(); }

void setBeginX(int x) { begin.setX(x); }

int getBeginY() { return begin.getY(); }

void setBeginY(int y) { begin.setY(y); }

void setBeginXY(int x, int y) { begin.setX(x);

                                     begin.setY(y);

}

int getEndX() { return end.getX(); }

void setEndX(int x) { end.setX(x); }

int getEndY() { return end.getY(); }

void setEndY(int y) { end.setY(y); }

void setEndXY(int x, int y) { end.setX(x);

                                     end.setY(y);

}

double getLength() {//вычисление длины отрезка

int xDiff = begin.getX() - end.getX();

int yDiff = begin.getY() - end.getY();

return sqrt(xDiff*xDiff + yDiff*yDiff);

}

};

//демонстрация использования классов

int main() {

Line l1(0, 3, 4, 0);// создание отрезка l 1 с координатами (0;3) и(4;0)

cout<<l1.getBeginX();//вывод координаты х

l1.setBeginXY(1, 2);//установка координаты начала

l1.setEndXY(3, 4);//установка координаты конца

cout<<l1.getBeginX();//вывод координаты х /

Point p1(3, 0);//создание точки с координатами (3;0)

Point p2(0, 4);//создание точки с координатами (4;0)

Line l2 (p1, p2);//создание отрезка из двух точек р1 и р2

cout <<"Длина отрезка "<< l 2. getLength ();

}

 

Контрольные вопросы и задания

1. Что такое композиция классов? Чем она отличается от агрегации?

2. Как обозначаются отнлшения объектов на UML-диаграмах?

3. Как обращаться в свойствам и методам «составного» класса?

4. Произведите декомпозицию объекта шкаф-купе на составляющие его объекты.

 



Поделиться:


Последнее изменение этой страницы: 2019-05-20; просмотров: 269; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.184.237 (0.008 с.)