41
Примечание: функции-элементы и методы класса имеют доступ ко всем эле- ментам-данным класса, следовательно, если сами функции-элементы и методы класса будут открыты, то и доступ к закрытым данным класса может быть получен посредством таких функций.
Для реализации схем доступа к элементом класса в интерфейсе класса применяются соответствующие атрибуты доступа: private, public, protected. Эти атрибуты следует ставить перед элементами (или группами элементов) в классе (в языке C++). При этом: private – указывает на закрытость элемента; public – указывает на открытость элемента; protected – указывает на доступность элемента в производных классах.
Смысл атрибутов доступа следующий:
- private – член класса с атрибутом private может использоваться только методами собственного класса и функциями-"друзьями" этого же класса; - protected – то же, что и private, но дополнительно член класса может
использоваться методами и функциями, а также “друзьями" производного класса, для которого данный класс является базовым;
- public – член класса может использоваться любой функцией программы, т.е. защита на доступ снимается.
Примечание: «друзьями» класса называются функции или другие классы; цель внесения в класс «дружественных» элементов – расширение видимости закрытых элементов класса для таких «друзей», при этом «дружественность» не наследуется; для выделения «друзей» применяется ключевое слово friend.
Принцип размещения описания интерфейса класса идентичен правилу описания интерфейса функций в языке Си. Приведём пример состава программного модуля в случае инкапсуляции некоторого класса:
1)начало программного модуля;
2)объявление класса;
3)определение функций класса;
4)окончание программного модуля.
Разработанный подобным образом программный модуль при необходимости создания экземпляра инкапсулированного класса (т.е. объекта класса) может быть использован в другом модуле посредством директивы #include.
Если классы – это группы однородных объектов, то группы классов – есть совокупность классов, объединённых по принципу общего использования элементов, принадлежащих определённым классам в группе (своеобразная «общественная собственность элементов» в группе классов). В случае использования
42
несколькими классами содержимого одного класса из группы говорят о «наследовании» содержимого такого класса (т.е. его данных и методов) другими классами группы. Класс, который предоставляет свои элементы для общего использования в группе, называется «базовым»; класс, который использует чужые элементы, называется «производным». Основная цель наследования – перенести базовые значения или характеристики в вершину иерархии классов и сделать эти характеристики достоянием всех последующих классов и экземпляров классов в иерархии. Этот принцип позволяет присоединять новую реализацию функций, инкапсулированных в базовом классе, на этапе дальнейшей разработки программного кода. Таким образом, каждая стадия разработки проекта на очередном итерационном шаге и представленная в виде артефакта – программного кода, может быть откомпилирована, отлажена и скомпонована в рабочий исполняемый программный комплекс. При этом добавление новых функциональных возможностей, спроектированных и разработанных на новой стадии проекта, осуществляется без перекомпиляции ранее отлаженного кода путём наращивания новых возможностей на имеющееся базовое ядро проектируемой информационной системы.
Пример: если указать параметры изображения экранного окна для одного базового окна (толщина и цвет рамки, фон, формат шрифта надписей, и т.д.), то все остальные создаваемые на его базе экземпляры окон будут иметь схожие характеристики, отличаясь, например, размером и назначением.
Пример: при написании алгоритма реализации некоторой функции в базовом классе и построении иерархии наследования элементов для такого класса мы сможем использовать такую функцию во всех экземплярах наследуемых классов, избежав необходимости многократного дублирования её кода.
В ООП (объектно-ориентированная парадигма) имеется два основных вида наследования – одиночное и множественное. Если класс наследует свойства или функции более чем у одного базового класса, то говорят о множественном наследовании. В противном случае имеет место одиночное наследование. Пример разновидностей одиночного наследования приведён на рисунке 9.
Пример разновидностей множественного и одиночного наследования приведён на рисунке 10.
|
43 |
|
|
а) |
б) |
в) |
|
Базовый класс |
Базовый класс |
Базовый класс |
|
А |
В |
С |
|
Производный |
Производный |
Производный |
Производный |
|
|
|
|
класс АА |
класс ВВ |
класс А |
класс В |
|
|
|
|
|
Производный |
Производный |
Производный |
|
класс ВВВ |
класс АА |
класс ВВ |
Схемы наследования: |
|
|
|
а) явное одиночное наследование; |
|
|
|
б) неявное одиночное наследование; |
|
|
|
в) неявное одиночное наследование; |
|
|
|
Рисунок 9 – Примеры одиночного наследования в иерархии классов |
|||
Пример описания иерархии наследования на языке С++ (см. рисунок 9): class AA: public A{}; // одиночное наследование, схема а
class ВВ: public В{}; // одиночное наследование, схема б class ВBВ: public ВВ{}; // одиночное наследование, схема б class А: public С{}; // одиночное наследование, схема в.
Общая схема синтаксических элементов описания наследуемости в иерархии посредством языка С++:
class cl3: atr1 cl1[, atr2 cl2]{};
Атрибут наследования осуществляет управление доступом к элементам базового класса (наследуемым элементам) внутри производного класса и влияет на дальнейшее наследование таких элементов.
Схема разграничения и управления доступом в производном классе к наследуемым элементам приведена в таблице 1.
44
Таблица 1– Схема разграничения и управления доступом при наследовании
Значение атрибута |
Значение |
атрибута |
Доступ в производном классе к |
наследования |
доступа в |
базовом |
наследуемым элементам |
|
классе |
|
|
Private |
private |
|
доступа нет |
|
protected |
|
доступ есть |
|
public |
|
доступ есть |
Protected |
Private |
|
доступа нет |
|
protected |
|
доступ есть |
|
public |
|
доступ есть |
Public |
Private |
|
доступа нет |
|
protected |
|
доступ есть |
|
public |
|
доступ есть |
С одной стороны, объектно-ориентированный язык С++, как и любой другой язык программирования, имеет свои, подчас жёсткие правила организации вычислений. С другой стороны, этот язык, как никакой другой, требует понимания объектно-ориентированной идеи. В противоположность процедурным языкам, которые позволительно использовать, освоив лишь начала алгоритмизации и выучив некоторый минимум операторов, создавать объектно-ориентированные программы на объектно-ориентированном С++ без предварительного проектирования (в т.ч. и иерархии наследуемости) классов невозможно. Язык С++ является лишь хорошим средством реализации проекта наследования и разграничения доступа к наследуемым элементам в иерархии классов.
Стимулом к изучению языка С++, как средства реализации объектноориентированной парадигмы, является возможность применения мощных библиотек классов MFC (Microsoft Foundation Classes) при осуществлении программных разработок в различных средах программирования (Visual Basic, ASP.NET, Microsoft Visual Studio и т.д.). Следует упомянуть также среду разработки (конфигуратор) модулей популярной системы 1С, в которой в качестве средства программирования применяется предметно-ориентированный язык, построенный на объектно-ориентированных принципах.
45
а) |
|
Базовый класс |
|
Базовый класс |
|
|
А |
|
В |
|
|
|
||
|
|
|
|
|
Производный класс АВ
б) |
|
|
|
Базовый |
|
|
Базовый |
|
||||
|
|
|
|
класс А |
|
|
класс В |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
Производный |
|
|
Производный |
|
||||
|
|
|
|
класс АА |
|
|
класс ВВ |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Производный |
|
|
|||||
|
|
|
|
|
класс АВС |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
в) |
|
|
|
Базовый |
|
|
|
|
||||
|
|
|
|
|
класс А |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
Производный |
|
|
|
Производный |
|
|||
|
|
|
|
класс АА |
|
|
класс ВВ |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Производный класс АВС
Схемы наследования:
а) явное множественное наследование; б) неявное одиночное и множественное наследование;
в) неявное одиночное и множественное наследование.
Рисунок 10 – Примеры множественного и одиночного наследования в иерархии классов