- •2. Появление ооп: необходимость в трансформируемых типах данных.
- •3. Появление ооп: необходимость обеспечения распределения вычислений в пространстве и во времени. Основные идеи ооп.
- •Классы объектов
- •Инкапсуляция атрибутов и методов класса
- •Системы классов: агрегация и композиция
- •Создание объектов и задание их начальных состояний
- •27. Создание объектов класса, использующих объекты других классов в качестве членов-данных
- •Возможности прямого доступа к членам базового класса, обусловленных только размещение в секциях базового класса и вложением видимости.
- •На возможности прямого доступа к членам базового класса существенное влияние оказывают спецификаторы доступа.
- •Трансформация секций базового класса, обусловленная видом наследования.
- •Виды сценариев наследования
- •43. Сравнение видов полиморфизма
27. Создание объектов класса, использующих объекты других классов в качестве членов-данных
В принципе, членом-данным класса может являться другой класс, указатель на другой класс или ссылка на другой класс. С указателями проблем не возникает вообще. С ссылками проблема имеется, поскольку любая ссылка – константа. Её нужно инициализировать в заголовке конструктора с помощью c-tor инициализации. С реальным объектом ещё большая беда – для него в заголовке конструктора включающего класса должен быть явно вызван конструктор с параметрами. Однако, если включаемый класс имеет конструктор по умолчанию, явного вызова в заголовке включающего класса можно не делать. И ещё: если класс содержит другие классы, то сначала создаются объекты включаемых классов в порядке объявления, а затем – объект включающего класса.
28. Проектирование конструкторов класса языка С++
-
Язык С++ позволяет для класса создать набор конструкторов.
-
Набор конструкторов м.б. задан для класса, определяется:
-
Информацией о способах создания и задания начальных значений.
-
Способы автоматического вызова конструкторов в программах на С++
-
Механизм переопределения функций на языке С++
Набор конструкторов должен представлять согласованную систему.
Пример.
Class Point
{
int x; int y;
public:
Point (int x0; int y0)
{x=x0; y=y0;}
}
class Square
{
Point P; //требуется конструктор без параметров
unsigned int w;
public:
Square (Point Q; unsigned int w0)
{P=Q; w=w0}
}
// основная программа
Point P(4,2);
Square (p,10);
Вывод: некорректность комбинации класс Point и класс Square не обеспечивает вызов конструктора без параметров, который требуется при создании подобъекта точка при создании объекта Квадрат.
-
Автоматический вызов конструктора класса С++ реализуется в следующих случаях:
-
При объявлении объектов в некоторых формах и задании их начальных состояний.
Пусть Т – класс
x- объект класса Т
а – объект класса Т или другого класса
Т х
Т х(а)
Т х=а
Т х=Т(а)
-
При передаче объектов в качестве параметров в тело функции.
-
При возврате значения функции с использованием ее имени.
-
При создании объектов с помощью оператора new
-
При инициализации массивов, когда инициализирующих значений меньше чем элементов массива, вызывается конструктор без параметров
В рассмотренном примере возможны следующие случаи обеспечения его корректости:
-
Убрать из класса Point имеющийся там конструктор и добавить конструктор без параметров
-
Убрать конструктор с параметрами и воспользоваться конструктором предоставляемы компилятором.
-
Добавить в конструктор значения по умолчанию.
Задание 16. Теоретически, практически и экспериментально ответить на вопрос: если в классе объявлена функция без значений по умолчанию, можно ли добавить значения по умолчанию в 1) файле реализации
2) в файле использующем функцию
-
С технологической позиции предоставляется целесообразным сделать следующее: нужно задать вызов нужного конструктора до выполнения функции Квадрат. В С++ существует список инициализации.
Формат списка инициализации:
Имя_класса (список_параметров): имя_члена_данного (список выражений)
{
//тело конструктора
}
Пример:
// реализация возможности 4.4
Square (Point Q, unsigned int w0): P(Q1), w(w0)
{}
Примечание: С++ позволяет защитить передаваемые значения.
29. Принципы проектирования классов.
-
Создание класса является задачей проектирования, решение которого зависит от:
-
Четкого и полного понимания содержания предметной области.
-
Представления о возможном развитии решаемых задач
-
От опыта, интуиции и знаний проектировщика
Строгих формальных способов проектирования класса не существует.
Профессионалы формулируют рекомендации по построению классов, учитывающих опыт, средства реализации, тенденции развития.
Принципы проектирования классов.
-
Принцип явного отображения объекта в предметной области.
Класс должен представлять реальный (существующий) объект предметной области, наиболее точно отображать его части, структуру и функциональные связи м/у ними, а также поведение объектов в предметной области и их частей.
-
Принцип прямого (непосредственного) отображения объектов в проблемной(предметной) области.
Square
{Point P;
Unsigned int w;
}
Square
{
Int x; int y; /*координаты левой верхней вершины*/
MoveToPoint (PointQ);
}
-
Принцип отсутствия дублирования.
Point
{
int x;
int y;
MoveToPoint(PointQ);
}
Члены-данные и члены-функции должны быть заданы так, чтобы исключить наличие членов-данных одинаковых по смыслу и форме.
Пример показывает, что в членах-функциях есть удобство обозначения совпадающий по смыслу функций.
-
Принцип ограничения доступа для пользователей класса.
Пользователь класса должен знать о классе только то, что позволяет его использовать.
Ограничение доступа организуется двумя действиями:
-
Ведением закрытой части класса, в которой помещается и члены-функции и члены-данные, к которым пользователь не имеет прямого доступа.
-
Ведение специальных функций для работы с членами закрытой части по правилам, установленных классом.
-
Принцип функциональной структурности класса.
Определение класса должно содержать функции 4-х видов:
-
конструкторы
-
деструкторы
-
селекторы
-
модификаторы
При этом функции из каждой группы должны обеспечивать надежное использование объектов класса.
Реализация: конструкторы должны полностью задавать экземпляр объекта.
-
Принцип общей простоты и наглядности.
Определение класса должно быть простым для понимания.
Общая простота для понимания обеспечивается организацией текста определения ориентированной на понимание.
Средства организации:
-
наглядные имена классов и членов;
-
компактность;
-
взаимное расположение и членов-данных и членов-функций
-
Принцип локальной простоты и наглядности.
Все необходимые для понимания выбранного члена класса должно быть расположено вблизи описания.
-
Принцип модульности.
Части описания класса должны быть разделены на части так, чтобы каждая эта часть могла быть оформлена в виде одного файла.
Задание 17. Для каждого принципа привести примеры реализации принципа.
30. Проектирование класса по контракту.
-
Основное назначение контракта это определить строго условие использования его потребителем.
-
Условия использование задаются правами и обязанностями сторон.
-
Класс предоставляет пользователю некоторые возможности определенные при каких-то условиях и гарантирует организацию этих возможностей при выполнении этих условий.
-
Пользователь класса обязан выполнить условия, которые выдвигает класс для реализации возможностей.
-
Возможности класса и условия их реализации описываются с помощью утверждений.
-
Структуру контракта образуют
-
Предусловия для всех членов-функций
-
Постусловия для всех членов-функций
-
Инвариант для класса
-
Предусловие для члена-функции класса – это высказывание о свойстве параметров и членов-данных, которые необходимы для выполнения ее назначения.
-
Постусловие – это высказывание, описывающее свойство возвращаемое функцией значения, параметрах и членов-данных необходимых для реализации функции своего назначения.
-
Инвариант класса определяет те свойства членов данных, которые присущи все объектам класса.
Инвариант класса – это утверждение, которое имеет значение "истина" тогда и только тогда, когда любой метод класса, вызванный
-
с агрументами, удовлетворяющий предусловию метода;
-
для объекта класса, атрибуты которого порождают значение "истина" инварианта класса,
порождает объект класса, с состояние, обеспечивающим значение "истина" инварианта класса.
-
Контракт для класса – это утверждение, включающее пред и постусловия для всех функций + инвариант класса.
-
Контракт предназначен для проверки условий, порождаемых задачей и структурой программы, разработанной для ее решения. Эти условия могут быть нарушены программой.
-
Процесс составления контракта был подробно на практических занятиях и должен быть реализован при выполнении л/р.
31. Отношение наследования в концептуальной модели ООП. Графическое представление наследования.
-
Ранее использование одним классом другого в форме отношения включения. Класс как модуль включал объект другого класса.
-
Концептуальная модель ООП предоставляет вторую возможность использования другим классам. Другой класс входит в первый в качестве подмодели.
Наследование в концептуальной модели ООП.
-
Идея наследования состоит в заимствовании одним классом другого класса. Сам класс – модель, он заимствует другой класс как подмодель.
-
Пусть есть два класса В и Д. В связан с Д отношением наследования, тогда и только тогда, когда имя Д имеет в своем составе все атрибуты, методы и уровни доступа В.
-
Когда Д имеет свои собственные атрибуты, методы и уровни доступа, отличные от В.
-
Любой объект класса Д ведет себя также, как объект класса В и может быть использован вместо него в соответствующих местах программы => правило подстановки.
-
Отношение наследования направлено от В к Д, т.к. базовый класс порождает.
-
Осуществить первые 2 условия можно и без наследования: переписав В в Д., объект Д м..б. подставлен во фрагменты. Объект класс Д м.б. использован во всех местах, где описан класс В.
-
Возможность подстановки фрагментов Д в В обусловлено:
-
Модель класса В обладает теми же возможностями, входит как подмодель в класс Д.
-
Модель В входит в класс Д полностью.
-
Действует правило подстановки.
-
При построении Д используется две возможности:
-
Класс Д добавлен в В только методы (атрибуты не добавляются)
-
Класс Д добавлен в В и атрибуты и методы.
Эти два пути называются сценариями наследования.
-
Семантика отношения наследования: модель класса Д включает полностью модель класса В. Класс Д получает все атрибуты и методы В. Класс Д может добавить свои атрибуты и методы в разных пропорциях. Объект класса Д может использоваться в тех участках программы, которые написаны для класса В.
-
Существует два способа установления наследования.
-
Добавление новых атрибутов и методов (специализация)
-
Обобщение, т.е. выделение у нескольких классов общих атрибутов и методов для образования нового класса.
P3
P2
P1
P
Пример.
class Point
{}
class Square
{
Point P;
}
Class Square: Point
{
// собственные для Square члены (атрибуты и методы)
}
Класс Квадрат – специализация класса Точка (больше деталей – более конкретно)
Все фигуры находятся в наследовании класса Точка
Обобщаем – выделяем отдельный класс.
Обобщение направлено от производного класса к базовому.
-
Класс может заимствовать модели либо от одного, либо от нескольких классов.
В первом случае наследование простое, во втором – множественное.
Графическое представление наследование (язык UML)
Класс В
Класс Д
Направлено в сторону более общего.
Класс В
Класс Д
Класс В1
Класс В2
Класс Д
32. Задание отношения наследования в языке С++
-
В С++ класс, который служит для построения нового называется базовым, а класс который получается – производным.
-
Смысл отношения наследования в С++ отличается от наследования в концептуальной модели. В С++ гораздо больше возможностей, чем в концептуальной модели ООП.
Вопросы:
-
Какие классы могут выступать в качестве базовых?
-
Как синтаксически задается отношение наследования?
-
Что получает производный класс от базового?
-
Что добавляет производный класс к базовому?
-
Что может изменить производный класс в использовании модели базового класса в производном?
-
Зависит ли структура и возможности (свойства) базового класса от наличия производного?
-
Каковы возможности и способы доступа к членам базового класса из производного класса?
-
Как выполняется конструктор базового класса?
-
Как д.б. организованы конструкторы производного класса и как будут инициализироваться члены базового класса.
-
Как выполняется конструктор производного класса?
-
Как д.б. организован деструктор?
-
Базовыми м.б. классы, определенные или объявленные как классы. Объявленные классы – хотя бы одна функция не определена.
-
Для определения или объявления класса с помощью наследования м.б. построен производной класс.
-
Формат задания отношения наследования.
|
class |
имя_класса |
: |
спецификатор_доступа |
имя_класса |
|
---|---|---|---|---|---|---|
служебное слово, задающее производный класс |
имя производного класса |
знак, задающий отношение наследования |
спецификатор вида наследования |
имя базового класса |
||
|
|
база наследования |
Спецификатор доступа: public, private, protected. Спецификатор может быть не указан, тогда по умолчанию используется private.
Пример.
class Point
{
Int x; int y;
public:
MoveToPoint(Point Q);
}
class Square: public Point
{
}
-
Производный класс может добавить свои члены-данные и свои члены функции.
class Square: private Point
{
unsigned int w;
public:
unsigned int Area();
}
-
Область видимости имен производного класса вложена в область видимости базового класса.
-
В производном классе могут использоваться имена, совпадающие с именами в базовом классе.
Пример.
class Square: private Point
{
unsigned int w;
public:
void MoveToPoint(Point Q);
// имя MoveToPoint класса Point скрыто таким же именем класса Square
}
-
На структуру базового класса может влиять факт, что у него уже есть или планируется производный класс.
Реализация влияния:
-
в базовом классе есть секция protected
-
наличие виртуальных функций в базовом классе
Наличие секций protected вызвано стремлением предоставить прямой доступ к функциям базового класса со стороны производного класса.
Появление виртуальных функций обусловлено необходимостью эффективной реализации правила подстановки.
33. Управление доступом в производном классе к членам базового класса
-
В этом разделе речь будет идти о прямом непосредственном доступе функций производного класса к членам базового класса
-
У членов базового класса существует перечень клиентов, которые "хотели бы" иметь доступ к этим членам.
Этими членами являются:
-
Функции-члены базового класса
-
Функции-члены производного класса
-
Функции вне базового и вне производного классов
-
Функции, дружественные к базовому классу
Замечание. В рамках данного курса дружественные функции рассматриваться не будут.
-
На возможность прямого доступа влияют следующие обстоятельства.
-
Размещение членов в секциях базового класса
-
Вложение областей видимости базового и производного классов
-
Влияние спецификатора вида наследования