Видимость компонентов класса, особенности разделов класса
Одно из больших преимуществ ООП — это инкапсуляция и ее поддержка для скрытия данных. Если работать с полями напрямую или просто показывать их, в результате детали реализации становятся известными и могут не всегда корректно взаимодействовать с внешним миром. Гораздо лучше написать методы для доступа к полям объекта, что позволит добиться настоящей инкапсуляции и исключит возможность некорректной модификации данных объектов. Вместо прямого доступа к полям вызываются соответствующие методы.
Основные достоинства такого доступа к полям следующие:
• Надежность данных
Вы можете предотвратить изменения компонента данных, выполнив в методе дополнительную проверку значения на допустимость. Тем самым можно гарантировать, что экземпляр всегда будет «исправен».
• Целостность ссылок
Перед доступом к объекту, связанному с вашим, вы можете удостовериться, что косвенное поле содержит корректное значение. Если это не так, например экземпляр уже отсутствует, то можно инициировать исправление положения, например, заново создать отсутствующий экземпляр.
• Предусмотренные побочные эффекты
Вы можете гарантировать, что каждый раз, когда выполняется обращение к полю объекта, синхронно с ним выполняется какое-либо специальное действие. Например, можно подсчитывать число обращений к экземпляру для целей статистики, для расчета суммы оплаты, ограничения доступа и т.п.
• Скрытие информации
Когда доступ к данным осуществляется только через методы, вы можете скрыть детали реализации объекта, а для изменения реализации вам будет необходимо изменить лишь методы доступа к полям. Те части программы, которые использовали ваш класс не будут затронуты.
Техника скрытия информации с помощью методов (отказ от прямого доступа к полям) одна из базовых концепций ООП и называется разграничением информации (information hid-ing). Удаляя ненужные внутренние детали из рассмотрения, это техника помогает сконцентрироваться на построении архитектуры своей системы на настоящем уровне абстракции.
Как уже упоминалось, ОР определяет несколько стандартных ключевых слов, называемых директивами, которые изменяют видимость компонентов, объявленных внутри описания класса. Для обеспечения различной видимости компонентов определение класса может быть разделено на несколько разделов с разной степенью видимости или доступности, включенных в них компонентов. Каждый раздел может начинаться с одной из директив: Private,
Protected, Public, Published.
Первый раздел по умолчанию, когда объявление класса не содержит разделов или до по-явления первой директивы видимости, считается разделом Public.
Синтаксис разделения определения класса на разделы следующий:
Type
<имя класса>=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, используемый для создания объектов ав-томатизации при использовании технологии СОМ. Создаётся автоматически в TLB.pas