Системы классов: агрегация и композиция




 

Понятие агрегации и композиции

1. Концептуальная модель ООП использует понятие ассоциации. Ассоциация выражает отношение «часть целого».

2. Ассоциация порождает 2 задачи:

- что содержит что?

- что содержится в чем?

3. Ассоциация направлена и ее направление порождается ролью. Ассоциация вводит отношение «часть – целое». ООП вводит понятие отношения.

Ассоциация порождает 2 роли.

Пример:

4. Ассоциация имеет имя, которое порождается ролью.

 

Пример: Объект Р класса Точка содержится в объекте S1 класса Квадрат. (одно направление – от точки к квадрату).

Объект S1 класса квадрат содержит объект Р класса Точка.

 

5. Ассоциация может иметь имя: одно из двух или оба вместе (содержит и/или содержится).

 

6. Ассоциация может задавать кратность вхождения части в целом или количество целых, в которые входит эта часть.

Пример: 1) 2 объекта класса Квадрат содержат 1 объект класса точка.

2) 1 объект класса точка содержится в двух объектах класса квадрат.

 

7. Ассоциация может быть реализована в двух видах:

- агрегация

- композиция

 

8. Агрегацией называется ассоциация, при которой часть существует независимо от целого.

 

9. Композицией называется ассоциация, при которой часть не существует независимо от целого.

 

10. Ассоциация устанавливает структурные связи.

 

11. В концептуальной модели ООП отношения, установленные для объектов, переносятся на классы.

 

UML – графическое представление объектов, агрегаций, композиций.

1. UML позволяет наглядно отобразить объект.

 

А) Основой для изображения объекта является изображение класса.

Пример: изображение класса

Именованный класс с набором атрибутов

Пример: построение изображения объекта.

1) Не именованный объект: 2) Именованный объект

       
   

 


Б) Изображение объекта повторяет изображение класса с одним отличием: (в поле имя_класса после «:» указано имя класса, которому принадлежит объект) и эта конструкция подчеркивается. Если объект не именован, то слева пусто. Если именован – указано имя объекта.

 

При построении изображения объекта 1ое поле ОБЯЗАТЕЛЬНО.

 

2. UML позволяет наглядно изобразить ассоциацию.

Пример:

3. Агрегация обозначается линией, оканчивающейся незакрашеным ромбом, направленным в сторону целого.

Пример:

 

4. Композиция обозначается линией, оканчивающейся закрашеным ромбом, направленным в сторону целого.

Пример:

 

10. Содержание и структура определения класса в языке С++: реализация концептуальной модели класса

Реализация классов объектов на языке С++

Содержание класса

 

В1: Каковы конструкции моделей ООП?

В2: Какова их семантика?

В3: Насколько реализация с помощью конструкций соответствует модели ООП?

 

Рассмотрим:

- Какие свойства модели ООП реализуются классами С++

- Как конструкции класса расширяют возможности ООП?

- Как и какие конструкции С++ обеспечивают надежность?

 

Свойства класса С++, реализующие модель ООП

 

1. Класс есть тип данных, задаваемый пользователем.

2. Класс С++ обязательно должен иметь имя.

3. Класс содержит средства создания объектов, называющиеся конструкторами.

4. Класс содержит средства уничтожения объектов, называющиеся деструкторами (так же предоставляются языком).

5. Класс является составным типом данных и имеет составляющие, называемые членами класса.

6. Разделение: члены-данные, члены-функции.

7. Члены-данные могут принимать значения, которые будут определять их состояние.

8. Члены-данные могут быть объектами других классов.

9. Класс может обеспечить создание объектов класса с помощью функции – члена класса и при этом задать состояние.

10. Члены-функции задают набор действий.

11. Члены класса доступны любому члену-функции этого класса.

12. Среди членов-данных могут быть члены, общие для всех экземпляров класса (ЧДОВЭК).

13. Вне класса классу не могут быть добавлены никакие члены.

 

Задание2: Разработать самостоятельно представительные примеры, демонстрирующие возможности классов С++ в реализации концептуальной модели классов.

 

11. Содержание и структура определения класса в языке С++: развитие концептуальной модели класса

 

Свойства класса, расширяющие модель класса ООП

 

1. Класс содержит конструкторы для создания объектов класса. Конструкторы разрабатываются программистом.

 

2. Конструкторы класса пишут программисты.

 

3. Программист может создать конструкторы, обеспечивающие создание объектов класса на основе разнообразной информации, относящейся к:

- составу членов – данных

- способу создания объекта (копирование и преобразование)

- способу использования объекта (объявление, вычисление выражения и тд.)

 

4. программист может задать средство уничтожения объектов.

 

5. В классе существуют секции: public, private, protected.

 

6. public – члены доступны вне класса

 

7. private – непосредственный доступ извне невозможен. Доступен только опосредованный доступ – через члены-функции секции public.

 

8. protected – члены доступны по имени членам - функциям производных классов.

 

9. Уровни доступа к членам класса С++ являются общими для всех объектов и задаются размещением в соответствующей секции.

 

Задание 3: разработка представительных примеров, иллюстрирующих возможность классов С++ в развитии концептуальной модели класса.

 

Средства, обеспечивающие эффективную технологию разработки.

 

1. В классе могут быть члены-функции, не являющиеся членами класса, но имеющие непосредственный доступ ко всем членам класса. Такими функциями могут быть:

- отдельные члены-функции других классов

- все члены – функции классов, отличных от данного

- функции, не принадлежащие никакому классу (если функция написана на другом языке).

 

12. Реализация членов-данных класса в языке С++

Реализация членов – данных

 

  1. Конструкция становится членом-данным, если ее объявление размещается в какой-либо секции класса.
  2. Член-данное представляет собой определение переменной, которое есть сочетание типа и имени.

Формат члена-данного:

Имя_типа имя_данного

Пример:

Double X; // абсцисса на плоскости

Double Y; // ордината

Double R; // R>=0

Double Fi; // Fi принадлежит [0, 2Pi]

 

/* Пример класса, представляющего точку на плоскости*/

Class Point

{

Double X; // абсцисса на плоскости

Double Y; // ордината

Double R; // R>=0

Double Fi; // Fi принадлежит [0, 2Pi]

}

 

  1. В качестве типов членов данных могут использоваться:

ü Предопределенный тип языка

ü Тип "класс" определенный пользователем

ü Указатель на предопределенный тип или тип "класс"

ü Ссылка на предопределенный тип или тип "класс"

 

  1. Использование указателя или ссылки не требует определение класса, достаточно только объявление класса.
  2. При объявлении члена-данного, как члена класса инициализация невозможна

Class Point

{//…

Double X=0; // ошибка!!!

//…

}

Члены данные м.б. инициализированы только конструктором

 

  1. Потенциальные пользователи члена данного могут быть

ü Члены-функции своего класса

ü Другие функции не принадлежащие этому классу

  1. Члены-функции класса имеют прямой доступ к членам-данным своего класса. Это означает, что в телах этих функций обращение к члену-данному осуществляется только с использованием его имению
  2. Функции не принадлежащие классу, в котором определен член-данное могут обращаться к этому данному только в том случае, если им разрешен доступ.

Уровень доступа определяет метка секции в которой определен член-данное

ü В открытой –разрешен доступ для любой функции

ü В защищенной – из функций не принадлежащих этому классу к нему имеет доступ только функции классов наследников

ü В закрытой – не имеет ни какого доступа функция, не принадлежащая этому классу

 

  1. Обращение к члену-данному, если это обращение разрешает уровень доступа, внешних функций осуществляется двумя способами

ü Использование оператора селекции "."

ü С использованием оператора указывания "->"

Для реализации первого способа нужно знать имя, а второго – указатель на этот экземпляр.

 

13. Реализация членов-функций класса в языке C++. Указатель this: назначение и использование

Реализация членов – функций

 

    1. Размещение, определение или объявление, функции к какой-либо секции лкасса делает эту функцию членом класса
    2. Если в определении секции класса помещено объявление, то определение должно быть размещено отдельно.

Class CPoint

{

//

Public

Void GetXY(double &, double &);

}

 

a) Построение определения функции и связывание определения с объявлением

b) Класс не определение, а проект или прототип класса

    1. Если в определении класс использовано определение функции, то вне определение класса должно быть специальным образом оформлено. Это специально оформление в использовании формата оператора расширение области видимости.

Формат:

Имя_класса::

Пример: CPoint::

Формат определения функции члена-класса вне определения класса:

 

Имя_типа имя_класса:: имя_функции (список паарметров)

{

// тело функции

}

 

Пример

Void CPoint:: GetXY(doublr & x0=0, double & y0=0)

{

x0=x;

y0=y;

}

 

    1. Члены-функции класса по своему назначению по отношению к пользователю класса делятся на 2 категории

ü Внутренние функции

ü Интерфейсные функции

    1. Внутренние функции недоступны пользователю класса и предназначены для эффективной реализации интерфейсных функций.

Пример:

ConvertXY и ConvertRFi – в закрытой части

 

    1. Интерфейсные функции – для пользователей класса и задают набор действий, которые можно выполнить с членами класса.
    2. По возможности влиять на состояние экземпляра класса интерфейса функции делятся на 4 категории

ü Селекторные (селекторы)

ü Модифицирующие (модификаторы)

ü Создающие экземпляр (конструкторы)

ü Разрушающия экземпляр (деструктор)

    1. Селекторы предназанчены для того, чтобы доставить пользователю класса значения атрибутов, они не должны быть изменены
    2. Модификаторы - для задания атрибутов членов класса
    3. Конструкторы предназначены для создания экземпляров и возможно задания им начальных состояний
    4. Деструктор – предназначен для разрушения экземпляра класса. Деструктор у класса один.

 

 

Указатель this: назначение и использование

 

  1. Когда функция, принадлежащая классу, вызывается для обработки данных конкретного объекта, этой функции автоматически и неявно передается указатель на тот объект, для которого она вызвана.
  2. Этот указатель имеет фиксированное имя this.
  3. Имя this является служебным словом. Явно определить указатель this нельзя и не нужно.
  4. В теле функции, вызванной для объекта, указатель this имеет смысл указания на самого себя.
  5. Использование указателя this – передача из объекта значения на самого себя для вставки этого указателя в массив или список.
  6. Используется для при наследовании, чтобы вернуть указатель на объект базового класса.

 

14. Защита членов-данных класса в языке С++: постановка проблемы и уровни защиты

 

Защита членов – данных

 

Постановка задачи

 

  1. При решении задачи защиты необходимо определить позицию рассмотрения.
  2. Нужно выявить обстоятельства, требующие защиты.
  3. Найти средства защиты.
  4. Сформировать способы защиты (средства могут применяться по-разному).

 

Способы защиты (относится к членам – данным)

 

1. Рассмотрение задачи защиты определяет позицию: будет разработана с позиции программиста, разрабатывающего класс. Он лучше всего знает объекты и их свойства, реализует способы использования этих объектов.

 

2. Обстоятельства защиты

- наличие членов-данных, которые не должны менять свое значение в период жизни объекта.

Пример: набор квадратов, имеющих общую вершину и разные стороны.

- необходимость обеспечит уровни доступа к членам – данным класса.

Р – точка и длина стороны

- наличие в классе членов – функций, которые имеют доступ к членам – данным и могут изменить их значение, даже если это не нужно.

- недопустимость изменения значений членов – данных объекта, которые передаются в какую-либо функцию в качестве параметра или возвращаются функцией в качестве результата.

 

3. Защита членов – данных может быть осуществлена на 2-х уровнях:

- на уровне доступа

- на уровне значения при заданном уровне доступа

 

4. Защита на уровне доступа защищает члены-данные от внешних по отношению к классу пользователей.

 

5. Эта защита реализуется размещение членов – данных в определенной секции класса.

Пример1:

Class Point

{ public:

int X;

int Y;

//...

}

1) Класс задает возможность изменения Х, У

2) Может быть, он задает способ изменения, установленный классом

3) К сожалению, любая функция программы, в которой определен класс, может изменить Х и У.

 

Пример2:

Class Point

{ int X;

int Y;

public:

setXY(int X0, int Y0)

{

X=X0;

Y=Y0;

}

//...

}

1) Сам класс предоставляет способы изменения членов-данных.

 

5. Защита на уровне значения при имеющемся доступе защищает от имеющихся функций класса.

 

6. В С++ средством защиты при заданном уровне доступа является спецификатор const.

 

7. Член – данное может быть задан так, что его значение не может быть изменено на всем периоде жизни объекта.

 

Пример:

Class Square

{ const Point P;

int W;

//...

}

 

После создания объекта изменить его значение нельзя.

 

Неизменность члена – данного, снабженного спецификатором const, гарантирует компилятор – он не разрешит изменять значение константного члена – данного нигде, кроме конструктора, включая его тело.

 

15. Защита членов-данных, заданных указателями и ссылками

 

8. Если в качестве члена – данного выступает указатель на объект некоторого класса, то возможны 3 варианта использования const.

 

 

class Square1 - защита значения, на которое показывает указатель

{

const Point *P;

}

class Square2

{

Point const *P;

}

class Square3

{

const Point const *P;

}

 

Пример:

class Square

{

const Point *P;

unsigned int W;

}

Указатель на объект класса Point не может быть изменен после инициализации объекта класса square.

 

Задание 6: теоретически и экспериментально ответить на вопрос: если член-данное задан конструкцией const Point *P, то можно ли, скопировав указатель, изменить значение объекта?

 

9. Пример:

class Square

{

Point const *P;

unsigned int W;

}

Указатель может быть изменен, значение – нет.

Использование такой формы допустимо, но требует дисциплины программирования, которая не допустит изменения значения объекта.

 

Задание7: теоретически и экспериментально ответить на вопрос: в чем разница с точки зрения синтаксической корректности и семантики между конструкциями:

Point const *P и Point * const P

 

10. Пример:

class Square

{

const Point* const P;

unsigned int W;

}

Ни указатель, ни значение не могут быть изменены.

 

Задание8: теоретически и экспериментально ответить на вопрос: если член-данное задан конструкцией const Point* const P, то можно ли, скопировав указатель, изменить значение объекта?

 

16. Защита членов-данных объекта, передаваемого в качестве параметра или возвращаемого значения

 

11. Защита объектов, передаваемых в функцию в качестве параметров также осуществляется с помощью const.

Пример:

class Square

{

const Point* const P;

unsigned int W;

 

MoveToPoint(const Point Q);

}

Объект, который замещает этот параметр, не может быть left – значением, т.е. левой частью оператора присваивания.

 

Задание9: теоретически и экспериментально ответить на вопрос: в чем заключается различие между передачей параметра по значению и использованием const у параметра?

Т.е. MoveToPoint (const Point Q);

и MoveToPoint(Point Q)

 

12. Если член-данное представлен ссылкой на значение, которое не должно изменяться, то в языке С++ существует только один вариант использования const.

Пример:

class Square

{

Point &P;

unsigned int W;

}

Ссылка в С++ по определению является константной, нельзя изменить значение ссылки, которая связана с объектом.

{

const Point &P;

}

 

13. Защита значения объекта, возвращаемого функцией, также осуществляется с использованием const, он размещается перед типом значения в описании или определении функции.

 

Причина появления средств защиты связана с тем, что в С++ существуют конструкции, которые могут изменить значение выражения, которое входит в возвращаемое значение.

Пример:

class Square

{

Point P;

unsigned int W;

 

public:

const Point GetP();

const unsigned int GetW();

}

 

пища для размышлений:

Пусть S – объект класса square. Тогда:

S.GetW()++; -?

S.GetW()+1; -? Проблем нет, так как S.GetW() не может изменить W

 

Дано: S – объект класса square.

Что будет:

 

1) S.GetW()++;

Применим ли к выражению оператор ++? Если применим, то какой будет результат?

 

2) S.GetP().SetX(X0);

---------- выражение, значение которого есть объект класса Point

можно по-разному расставлять скобки.

 

3) S.GetP().GetX();

--------- функция не должна изменять значение членов-данных

 

Вывод: Пример 3) делает целесообразным правило в языке:

константно возвращаемо объекту могут быть только константные функции члены класса.

 

Задание10: теоретически и экспериментально ответить на вопрос: можно ли для константного параметра или константного возвращаемого значения члена-функции вызвать в теле функции, являющейся модификатором?

 

14. С++ предусматривает использование const для образования константных функций. Определение или объявление константных функций делается просто: размещением const после списка параметров и в объявлении, и определении функции.

 

17. Реализация в языке С++ членов-данных класса, общих для всех объектов класса

 

Реализация членов – данных, общих для всех объектов класса и членов – функций для их обработки

1. Концептуальная модель класса ООП допускала существование общих членов-данных класса, но не определяла путей реализации.

 

2. В классе С++ можно задать члены-данные, общие для всех экземпляров класса (ЧДОВЭК) и члены-функции для их обработки.

 

3. При рассмотрении реализации ЧДОВЭК необходимо получить ответы на следующие вопросы:

В1: Как объявить ЧДОВЭК, функции для их обработки, и какова область видимости этих конструкций?

В2: Какова семантика ЧДОВЭК и функций для их обработки?

В3: как и где инициализировать ЧДОВЭК?

В4: Как построены члены-функции для обработки ЧДОВЭК?

 

Реализация и семантика ЧДОВЭК

 

1. ЧДОВЭК должен быть объявлен в классе.

2. ЧДОВЭК может быть объявлен в любой секции только 1 раз.

3. Область определения ЧДОВЭК совпадает с областью видимости класса.

4. ЧДОВЭК объявляются с атрибутом static.

5. ЧДОВЭК создаются компилятором при входе в область определения класса.

6. Уничтожаются при выходе из области определения класса.

Счетчик реализуется в закрытой части, доступ осуществляет конструктор (+1) и деструктор (-1).

 

Жизненный цикл ЧДОВЭК

 

Диаграмма определяет семантику, ЧД доступны до и после существования объекта.

 

имя

 

Инициализация ЧДОВЭК (2.5.5.2)

 

1. ЧДОВЭК в С++ может быть инициализирован с помощью оператора инициализации.

Формат оператора инициализации

Имя_типа имя_класса:: имя ЧДОВЭК= значение

 

Пример:

Class Point

{

unsigned int X;

unsigned int Y;

static unsigned int counter;// счетчик

}

Оператор инициализации:

unsigned int Point:: counter=0;

 

2. ЧДОВЭК может быть инициализирован в областях свое видимости только один раз. Оператор инициализации ЧДОВЭК может быть помещен в файл определения, объявления класса или вне этих файлов.

 

Схема1: если оператор реализуется в определении или проекте класса, то ЧДОВЭК будет общим для всех файлов, использующих проект.

 

Схема2: Полезна тем, что позволяет инициализировать ЧДОВЭК в соответствии с задачей, определяемой программой.

 

18. Реализация в языке С++ членов-функций для обработки общих членов-данных

 

Реализация членов-функций для обработки ЧДОВЭК

 

1. С++ предусматривает для обработки ЧДОВЭК специальные функции, которые имеют в совеем составе атрибут static.

 

Пример:

Class Point

{

static unsigned int counter;// счетчик

public:

static unsigned int GetCounter();

}

2. Функция для обработки ЧДОВЭК может быть определена как в самом классе, так и вне его.

Пример определения функции GetCounter класса Point вне класса:

unsigned int Point:: GetCounter()

{ return Counter;}

3. Если функция-член класса с атрибутом static определяется вне класса, то при определении атрибут static не указывается.

4. Функция-член класса с атрибутом static не имеет параметра с указателем this (благодаря ему узнаем, для какого объекта вызвана функция) и, следовательно, без указания ссылки на объект не может непосредственно обращаться к членам класса.

5. В силу положения (4) функции с атрибутом static предназначены только для использования членов-данных с атрибутом static.

6. Функция-член класса с атрибутом static не может быть объявлена как константная (не может защитить, так как не имеет прямого доступа).

7. Функцию-член класса с атрибутом static можно использовать в те периоды, когда не существует ни одного объекта (с помощью оператора разрешения видимости).

 

Задание11: разработать самостоятельно используя л/р 2 представительные примеры, иллюстрирующие все положения раздела 2.5.5.

 

Задание12: ответить теоретически и экспериментально на вопрос: может ли функция-член класса С++ со спецификатором static использовать члены-данные, и, если может, то каки способом.

 

8. в классе не могут быть определены 2 функции, имеющие одинаковое имя и одинаковый тип возвращаемого значения, но различающиеся наличием или отсутствием атрибута static.

 

19. Использование членов класса, общих для всех объектов класса, для тестирования и отладки ОО программ

 

Задание13: разработать самостоятельно технологию тестирования классов объектов, основанную на использовании ЧДОВЭК.

 

20. Особенности реализации инкапсуляции в классе языка С++

Особенности реализации инкапсуляции

 

1. В классе С++ члены-данные и члены-функции подчиняются общим правилам задания доступа.

2. В С++ уровни доступа членов класса определяются видом секции, в которой размещено определение или описание членов класса (методы не могут быть отнесены к атрибутам).

3. В С++ предлагаются 3 уровня доступа (открытый, закрытый, защищенный). В концептуальной модели – открытый для методов и закрытый для атрибутов.

4. В С++ уровень доступа, определенный для всех членов класса, является одинаковым для всех объектов класса. В концептуальной модели – для внешних пользователей класса уровень доступа для всех членов класса является общим для всех объектов.

Концептуальная модель допускает 2 толкования для внутреннего пользователя класса.

5. В С++ из правила, сформулированного в пункте 4 есть единственное исключение. Если объект некоторого класса передается в функцию-член того же класса в качестве параметра, то эта функция имеет прямой доступ к членам передаваемого объекта.

 

Пример: реализация прямого доступа к члену объекта класса, передаваемому функции-члену того же класса в качестве параметра.

Class Point

{

int X;

int Y;

public:

void MoveToPoint(Point Q)

{

X=Q.X; Y=Q.Y;

}

}

 

6. Член-функция класса С++ может напрямую обращаться только к членам того объекта, для которого она вызвана.

7. Класс С++ может «открывать класс» для авторизированных пользователей.

«Открывать класс» означает, что класс предоставляет доступ к закрытым и защищенным членам класса функциям, которые членами этого класса не являются.

Авторизированные пользователи – те сущности программы, которым класс предоставляет возможность использовать закрытые сущности класса.

Сущности – все или частично функции других классов или функции, не принадлежащие никакому классу.

В С++ такие сущности имеют атрибут friend и называются друзьями класса.

8. Уровни доступа, установленные в классе могут быть переданы классу по наследству либо с изменениями, либо без них.

 

21. Сравнение класса языка С++ и концептуальной модели класса: структура класса и управление доступом к элементам

Сравнение свойств класса С++ и класса концептуальной модели ООП

 

Группы свойств:

- структура класса

- управление доступом к членам класса

- описание значения объекта

- интерфейс объекта

 

Наименование группы свойств Свойства группы Описание свойств
Концептуальная модель ООП Класс С++ Пр
Структура класса Наличие структурных частей класса   Произвольное количество  
Состав структурных частей Секция «Атрибуты» Секция «Методы» Секция 3-х видов: - открытая - закрытая - защищенная  
Виды элементов структурных частей Атрибуты Методы -Члены класса -друж. функции - друж. Классы - определения других классов  
Управление доступом к элементам класса Уровни доступа Открытый закрытый Открытый Закрытый защищиенный  
Предмет задания доступа Атрибуты Методы Члены класса Дружественные функции Дружественные классы Определения других классов  
Количественные характеристики задания доступа Размещение в секциях Размещение в секциях (члены класса) Размещение в определении класса (все остальное)  
Способы доступа к элементам класса Все атрибуты Все методы Член класса  
    22. Сравнение класса языка С++ и концептуальной модели класса: значение объекта и интерфейс класса  
Описание значения объекта класса Наличие значения Обязательно Не обязательно  
Типы, связанные с использованием значений Не систематизированы 1 класс 2 указатель на класс 3 ссылка на значение класса (для переопределенных типов)  
Уровень задания защиты значений На уровне класса На уровне объекта На уровне класса    
Средства защиты по доступу Уровень доступа Уровень доступа  
Средства защиты значений Дисциплина программирования
  1. Дисциплина программирования
  2. средства языка (const)
 
Интерфейс класса Уровень задания интерфейса На уровне класса На уровне объекта На уровне класса    
Элементы класса, обеспечивающие интерфейс Методы Члены – функции и члены-данные из открытой части Дружественные функции  
Количество элементов интерфейса Не ограничено  

 

Задание14: выполнить самостоятельно по методике, изложенной в разделе, сравнения основных свойств класса С++ и концептуальной модели ООП.

 

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: