Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.doc
Скачиваний:
8
Добавлен:
25.12.2018
Размер:
683.01 Кб
Скачать

3. Видимость компонентов класса

Одно из больших преимуществ ООП - это инкапсуляция и ее поддержка для скрытия данных. Если работать с полями напрямую или просто показы­вать их, в результате детали реализации становятся известными и могут не всегда корректно взаимодействовать с внешним миром. Гораздо лучше напи­сать методы для доступа к полям объекта, что позволит добиться настоящей инкапсуляции и исключит возможность некорректной модификации данных объектов. Вместо прямого доступа к полям вызываются соответствующие методы. Основные достоинства такого доступа к полям следующие:

Надежность данных. Вы можете предотвратить изменения компонента данных, выполнив в методе дополнительную проверку значения на допусти­мость. Тем самым можно гарантировать, что экземпляр всегда будет "исправен".

Целостность ссылок. Перед доступом к объекту, связанному с вашим, вы можете удостовериться, что косвенное поле содержит корректное значе­ние. Если это не так, например экземпляр уже отсутствует, то можно иниции­ровать исправление положения, например, заново создать отсутствующий экземпляр.

Предусмотренные побочные эффекты. Вы можете гарантировать, что каждый раз, когда выполняется обращение к полю объекта, синхронно с ним выполняется какое-либо специальное действие. Например, можно подсчиты­вать число обращений к экземпляру для целей статистики, для расчета суммы оплаты, ограничения доступа и т.п.

Скрытие информации. Когда доступ к данным осуществляется только через методы, вы можете скрыть детали реализации объекта, а для изменения реализации вам будет необходимо изменить лишь методы доступа к полям. Те части программы, которые использовали ваш класс не будут затронуты.

Техника скрытия информации с помощью методов (отказ от прямого доступа к полям) одна из базовых концепций ООП и называется разграниче­нием информации (information hiding). Удаляя ненужные внутренние детали из рассмотрения, это техника помогает сконцентрироваться на построении архитектуры своей системы на настоящем уровне абстракции.

Как уже упоминалось, ОР определяет несколько стандартных ключевых слов, называемых директивами, которые изменяют видимость компонентов, объявленных внутри описания класса. Для обеспечения различной видимости компонентов определение класса может быть разделено на несколько разде­лов с разной степенью видимости или доступности, включенных в них ком­понентов. Каждый раздел может начинаться с одной из директив: Private,

Protected, Public, Published.

Первый раздел по умолчанию, когда объявление класса не содержит разделов или до появления первой директивы видимости, считается разделом

Public.

Синтаксис разделения определения класса на разделы следующий:

Type

<имя класca>=Class[(<имя родительского класса>}]

Private // Внутренние детали реализации класса

<частные поля и методы>

Protected // Интерфейс разработчика

<защищенные поля и методы>

Public // Run-time интерфейс

<публичные поля и методы>

Published // Design-time интерфейс

<опубликованные поля и методы>

End;

Особенности указанных разделов следующие:

Private (частный). Означает высший уровень ограниченности видимо­сти компонентов класса. Компоненты видны только в пределах модуля, в ко­тором виден этот класс. Таким образом, другое классы и другие переменные могут видеть компоненты этого раздела только внутри этого модуля. Обычно в этот раздел помещают поля и методы, оказывающие решающее воздействие на поведение объектов и их неосторожная модификация может привести к непредсказуемым последствиям.

Protected (защищенный). Означает частично ограниченную видимость компонентов класса. Доступ возможен через методы класса и, кроме того, компоненты видны внутри потомков этого класса, в том числе и в других мо­дулях. Если потомки не объявлены, то поля и методы этого раздела анало­гичны разделу Private.

Public (публичный). Означает полную видимость. Компоненты этого раздела класса видны всюду, где виден сам класс. Вместо полей Public часто используются свойства.

Published (опубликованный). Компоненты этого класса не только дос­тупны, как и компоненты Public, но они имеют специальную информацию для Инспектора объектов Delphi. Для полей и методов этого раздела порож­дается информация о типах времени выполнения (RTTI). Во время выполне­ния программы компоненты, объявленные в разделах Public и Published, ведут себя одинаково, однако информацию о компонентах из раздела Published можно получить из внешней программы.

На компоненты из этого раздела, накладываются ограничения:

• Любое поле в этом разделе должно иметь тип класса или интерфейса.

• Свойства, объявляемые в этом разделе, могут иметь порядковый, дей­ствительный (кроме Real48), строковый, тип класса или интерфейса, малого множества (ограничен значениями 0..31) или указателя на метод (но не гло­бальный процедурный тип).

• Класс может иметь этот раздел, если он генерируется с командой ге­нерации информации о типах времени выполнения (команда компилятору задается ключом $М+, иначе будет раздел Public) или является наследником этого класса.

• Чаще всего этот раздел не содержит ни полей, ни методов. В ней нахо­дятся свойства.

Хороший стиль программирования предполагает, чтобы все поля отно­сились к разделу Private, а методы - к Public.

Фактически есть еще один раздел - Automated, используемый для созда­ния объектов автоматизации при использовании технологии СОМ.