Как уже говорилось выше, объединение полей данных и процедур и функций, работающих с этими данными, в единый пакет при наличии специальных правил доступа к элементам пакета называется инкапсуляцией.
Наличие интерфейса обеспечивает уменьшение возможности «разрушения» (несанкционированного изменения значений полей) объекта извне. При этом сокрытие особенностей реализации упрощает внесение изменений в реализацию класса как в процессе отладки, так и при модификации программы. Таким образом, класс определяет существование глобальной области данных внутри объекта, доступной методам объекта.
Рис. 15 −Интерфейс и реализация класса
С другой стороны, доступ к объекту регламентируется и должен выполняться через специальный интерфейс (см. рис. 15).
Как и любая переменная программы, объект должен быть размещен в памяти (создан) и удален из памяти (уничтожен). Причем создание и уничтожение объектов выполняется статически или динамически.
Статическое создание объектов выполняется в процессе компиляции программы, а статическое уничтожение − при завершении программы: объект удаляется из памяти вместе с программой.
Динамическое создание и уничтожение объектов выполняется в процессе работы программы специальными командами.
Операция создания и инициализации полей объекта получила название конструирования объекта, а операция уничтожения объекта − деструкции объекта. Соответствующие методы, если они определены в классе, получили название конструкторов и деструкторов. Конкретные особенности этих методов в различных языках программирования будут обсуждаться в соответствующих разделах.
Рассмотрим сокрытие реализации класса (класс Файл) на примере «Записной книжки».В соответствии с результатами объектной декомпозиции (см. рис. 10.) Файл должен реагировать на следующие сообщения: «Открыть», «Добавить запись», «Найти запись».
Каждое сообщение должно дополняться необходимой информацией. Так, сообщение «Открыть» должно сопровождаться передачей имени файла. Сообщение «Добавить запись» должно сопровождаться передачей текста записи, состоящей из двух частей: фамилии абонента или названия организации и телефона. Сообщение «Найти запись» должно сопровождаться передачей фамилии абонента или названия организации, по которым должен быть найден телефон. Каждому сообщению должен соответствовать метод, объявленный в интерфейсной части класса и реализующий требуемые действия.
Метод Открыть должен выполнять открытие указанного файла для выполнения операций ввода-вывода. Операция открытия файла требует указания файловой переменной. Поскольку при выполнении операций с этим файлом в дальнейшем должна будет использоваться та же файловая переменная, целесообразно описать ее в секции реализации класса, где она будет доступна методам данного объекта, но не доступна из других объектов программы.
Метод Добавить должен проверять наличие открытого файла и сообщать пользователю о невозможности выполнения операции с закрытым файлом. Если же файл открыт, метод должен выполнить добавление записей в файл. Для выполнения проверки необходимо хранить информацию об открытии файла, для этого можно использовать специальное поле Состояние_файла, которое также можно объявить в секции реализации.
Метод Найти также вначале должен проверять, открыт ли файл. Если файл открыт, метод выполняет поиск информации в файле. Операции проверки открытия файла выполняются в методах Добавить и Найти идентично, их можно выделить в отдельный метод Проверка_открытия, который можно описать в секции реализации.
Для инициализации поля Состояние_файла (в исходном состоянии файл закрыт) можно использовать специальный метод, традиционно с этой целью используется конструктор. При завершении программы файл необходимо закрыть. Операция закрытия может быть описана в деструкторе.
Окончательно для реализации объекта Файл можно предложить класс следующей структуры:
Класс Файл:
интерфейс
конструктор Инициализировать;
метод Открыть (имя файла);
метод Добавить (фамилия, телефон);
метод Найти (фамилия);
деструктор Закрыть_файл;
реализация
поле Файловая_переменная;
поле Состояние_файла;
метод Проверка_открытия;