Лекция: Группирование классов
Когда система разрастается до десятка классов, можно заметить группы классов, связанные внутри и слабо зацепляющиеся с другими. Такие группы классов образуют пакет. Пакетом в области объектно-ориентированных технологий называют общий механизм организации элементов в группы. В данном контексте мы будем говорить только о группировании классов и называть пакетом группы, содержащие классы и другие пакеты.
Пакет не имеет операций или состояний в явном виде, они содержатся в нем неявно в описаниях агрегированных классов.
Некоторые классы в пакете могут быть открытыми, то есть экспортироваться для использования за пределы пакета. Остальные классы могут быть частью реализации, то есть не использоваться никакими классами, внешними к этому пакету.
В C++ пакеты классов реализуются с помощью введения пространств имен – namespace. Однако пространство имен позволяет реализовать более широкое понятие. Оно может включать в себя классы, другие пространства имен, свободные подпрограммы и глобальные (внутри пространства имен) данные.
Пример. Объединим все классы, разработанные для использования в графической системе в одну компоненту. Предоставим пользователю описания в файле GraphSys.h:
namespace GraphSys{
class Point{… };
class Color{… };
class Shape {… };
class Circle: public Shape{… };
class Triangle: public Shape {… };
class Square: public Shape{… };
class SolidCircle: public Circle {… };
}
Реализация указанных классов находится в файле GraphSys.срр:
namespace GraphSys{
Circle :: draw ( ){...}
Triangle :: draw ( ){...}
Square :: draw ( ){...}
SolidCircle :: draw ( ){...}
.. .
}
Обращение к членам пространства имен осуществляется с использованием явной квалификации:
GraphSys :: Circle C;
GraphSys :: SolidCircle SC;
С другой стороны, описание using в пользовательском коде позволяет не использовать все время явную квалификацию:
#include GraphSys.h
using namespace GraphSys;
void user_func ( ){
Circle C;
.. .
C -> draw ( );
}