Дж. Рамбо, М. Блаха - UML 2.0 - Объектно-ориентированное моделирование и разработка (1158633), страница 91
Текст из файла (страница 91)
В отсутствие перечислений для группировки и совместного использования констант можно использовать интерфейсы (см. раздел 18.3А). Явные модификаторы риЫС, згайс и )(па) не 18.3. Реализация структуры 381 обязательны, потому что по умолчанию они действуют на все поля типа вп, определенные в интерфейсе. Обратите внимание, что интерфейс Епитеспгюп из библиотеки классов )ача уже отменен, как устаревший. Он предоставлял рудиментарные операции для итерирования и не имеет отношения к перечислимым типам. рчьыс слсесгасе сасб рчыгс ссасгс гглат спс сьзв = со рчысс зсассс сглаз гпс оглионо = 1; рчьгсс ссассс гглаг слс валат = вч рчьггс сасгс сглаг ссс зэков = з; 18.3.2. Классы Объектно-ориентированные языки программирования позволяют реализовывать объекты напрямую, непосредственно. Вы должны объявить все атрибуты и методы модели классов внутри соответствующих классов С++ или )ача.
Кроме того, вам придется добавить атрибуты и методы для реализации ассоциаций (см. раздел 18.8.8). Разумно переносить в программу названия из проектной модели. Вы можете рассматривать объекты как сушности, предоставляющие сервисы запрашиваюшим их клиентским объектам. Сервисы — это открытые методы класса. Методы описывают протокол запроса сервисов. Параметры методов — это информация, необходимая объекту для предоставления сервиса, а возвращаемое значение — ответ объекта на клиентский запрос.
Начинайте с обшедоступного интерфейса класса, а потом добавляйте внутренние методы и атрибуты, обеспечивающие поддержку открытых методов. Поскольку открытые методы документируют поведение класса, они обычно приводятся в начале объявления этого класса. Впрочем, это не обязательное условие. И в С++, и в )ача разрешение символов осуществляется только после полного считывания определения класса, поэтому методы могут ссылаться друг на друга в любом порядке. 18.3.3.
Управление доступом Для сервисов, которые могут запрашиваться или вызываться клиентами, в классе должны быть определены соответствующие открытые методы. Не подлежащие изменениям данные тоже можно объявить как открытые. Все остальные члены класса (атрибуты и методы, служашие для внутренней реализации внешней функциональности) должны быть сделаны невидимыми и недоступными для других объектов и функций. Для управления доступом клиентов к методам и данным в С++ и в ~ача используются слецификаторы доступа (ассезз зрес16егз или ассезз шод1йегз). Основные спецификаторы, применимые к атрибутам и методам, одинаковы в обоих языках. Только методы самого класса могут обрашаться к атрибутам и методам, имеющим спецификатор рнъаге (закрытый).
Любой клиент может работать с членами класса, имеющими спецификатор рибйс (открытый). 382 Глава 18 ° Объектно-ориентированные языки Управление доступом в Зача Жесткая инкапсуляция в ) ача требует внимательного отношения к пакетам и к спецификаторам доступа. Пакеты )ача ограничивают область привилегированного доступа.
Название пакета объявляется в самом начале файла исходного кода; таким образом, к одному пакету может быть отнесено несколько файлов. Если метод или атрибут не имеет явного спецификатора рнпаге, другие методы и классы, определенные в том же пакете, могут свободно обрашаться к нему. Если название пакета не указано, класс считается принадлежащим глобальному пакету, и все его члены, за исключением закрытых, доступны всем остальным классам, не принадлежащим каким-либо пакетам.
Мы рекомендуем не помещать классы в глобальный пакет. Более того, все атрибуты и методы, не являющиеся открытыми, следует делать закрытыми, то есть объявлять их как риэате, потому что пакетная область видимости не обеспечивает жесткой инкапсуляции. Доступ к атрибутам следует контролировать при помоши методов-оберток. В языке )ача имеется возможность управления доступом не только к членам классов, но и к самим классам. Класс должен быть объявлен как рибас, чтобы его открытые методы были доступны клиентам, находящимся вне его пакета.
См. раздел «Видимость и доступ к классамю Управление доступом в С++ Спецификаторы доступа С++ действуют на целые секции объявления класса. Все члены класса считаются закрытыми, пока компилятор не встретит явный спецификатор доступа. Спецификаторы могут присутствовать в любом месте объявления класса, и их действие распространяется до следующего спецификатора. Все атрибуты и методы, не относящиеся к интерфейсу класса, опять-таки, следует сделать закрытыми.
Ослаблять ограничения доступа нужно только при наличии достаточно веских оснований. Управление доступом в структурах С++ осуществляется по тем же принципам, но с важным отличием: все члены структуры по умолчанию считаются открытыми (см. раздел 18.3.1). Язык С++ позволяет открывать выборочный доступ к закрытым членам класса при помоши объявления ~пепИ. Класс может предоставить доступ к функции, методу или классу, но при этом он открывает доступ ко всем своим закрытым членам.
Поэтому объявление дружественности следует использовать с осторожностью. Видимость и доступ к классам Класс должен быть виден своим потенциальным клиентам, иначе они не смогут распознать его тип и не получат доступа к его открытым членам. В С++ и )ага минимальным компилируемым блоком является файл. Классы в одном файле видны друг другу, но на практике рекомендуется не помещать в один файл более одного класса (возможно, со вспомогательными классами).
Классы из внешних модулей необходимо явным образом сделать видимыми компилируемому классу. В)ача видимость и доступ определяются структурой пакетов. Классы, находяшиеся в разных файлах одного пакета, считаются видимыми друг другу. Пакеты 18.3. Реализация структуры 383 связаны со структурой файловой системы на диске: все файлы пакета должны находиться в каталоге, имя которого совпадает с именем этого пакета.
В процессе компиляции и выполнения программы ) ача использует переменную окружения С1АВВРАТН, задающую отправную точку для поиска пакетов внутри файловой системы. Пакет может содержать множество классов, но в каждом файле исходного кода )ача может быть только один класс с видимостью риЬ)(с, и имя этого класса должно совпадать с именем файла. Внешние по отношению к пакету классы могут использовать только открытые методы открытых классов. Чтобы открытый класс был виден классу из другого пакета, нужно использовать директиву импортирования: (тров( расйайелате.с!азтпате или (тров( расйабелате.". Система осуществляет поиск необходимых классов все по тому же маршруту СЕАБэРАТН. Пример с банкоматом.
Каждый класс находится в отдельном файле. Например, файл ВапИ)апа будет содержать следующие строки: расваяе Ьапьгпсо рпЬ11с с1авв Вась ( . . . ) Файл Сивготет)апа будет содержать текст: расвазе Ьапв1псо рпЬ11с с1авв Совоопес ( . . . ) Файлы Вал Цала, Симотел(ига и другие классы пакета ЬалЬТп(о должны находиться на диске в папке ЬапЬ(л(о. Чтобы классы ВапЬ и Сивготегбыли доступны классу А ТМзеЫоп, который не входит в пакет ЬалЫп~о, в файл этого класса необходимо включить строки: 1еросп Ьапв1пто.
рсщ1с с1авв ативеввьоп ( Директива (л)рогг делает видимыми и доступными открытые методы открытых классов пакета Ьаля!и!о. Строгих правил именования пакетов нет, но это не значит, что вам следует использовать глобальный пакет. Не используя классы, вы теряете управление видимостью и доступом.
Закрытые атрибуты все равно остаются закрытыми, однако методы, предназначенные для доступа к этим атрибутам, становятся фактически открытыми, а кроме того, открывается доступ к вспомогательным классам, предназначенным для ограниченного использования. С++ не накладывает ограничения на размещение файлов исходного кода или скомпилированных модулей. Программы С++ делятся на заголовочные файлы, в которых содержатся объявления (в том числе и классов), и файлы реализации, в которых содержится код всех методов, за исключением наиболее простых (которые можно реализовать прямо внутри объявления класса).
Для введения символов из одного файла в другой используется директива №(лс(и(!е <!))епал(е> (в случае, если файл находится в папке, предназначенной для хранения таких файлов) или №тс(и((е '!()еиате" (в кавычках указывается полное имя файла). Эта директива ставится в самом начале файла исходного кода. Фактически, эта директива осуществляет подстановку символов из соответствующего заголовочного файла в компилируемый файл исходного кода.