Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВВЕДЕНИЕ В ОБЪЕКТНО Ориентированное программиро...docx
Скачиваний:
19
Добавлен:
29.08.2019
Размер:
1.01 Mб
Скачать

Области видимости

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

1. общие - public;

2. личные - private;

3. защищенные - protected;

4. опубликованными - published;

5. пятая группа automated рассматриваться не будет.

Директива, определяющая видимость используется перед описанием элемента класса. Поля, свойства и методы, объявленные public не имеют ограничений на видимость. Они доступны из других функций и методов объектов, как в данном модуле, так и во всех прочих, ссылающихся на него (через директиву uses и имя модуля). Поля, свойства и методы, объявленные private, доступны только в методах класса и функциях, содержащихся в том же модуле, что и описываемый класс. Такая директива позволяет полностью скрыть детали внутренней реализации класса в пределах модуля. Свойства и методы из секции private можно изменять и это не будет сказываться на других элементах программы, работающих с объектами этого класса. Единственный способ для кого-либо другого обратиться к ним - переписать заново созданный ранее модуль (если, конечно, доступны исходные тексты).

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

Пример:

Если бы процедура TestProc2 была объявлена в третьем модуле, метод Method2 был бы недоступен и для класса TSecondObj, так как он доступен только в том модуле, где этот класс определен.

Область видимости, определяемая четвертой директивой - published, имеет особое значение для интерфейса визуального проектирования Delphi. С этой директивой объявляются те свойства объекта, являющегося компонентом Delphi, которые будут видны не только во время исполнения приложения, но и из среды разработки. Публиковать можно свойства большинства типов, за исключением векторных свойств и старого типа real (real48). Все свойства компонентов, доступные через инспектор объектов, являются опубликованными свойствами. Во время выполнения такие свойства общедоступны, т.е. имеют ту же область видимости, что и объявленные public. Если элемент класса продекларирован без указания спецификатора видимости, он будет иметь ту же видимость, что и предыдущий. Если спецификатора видимости не имеет элемент, стоящий первым в описании класса, он либо будет иметь видимость published, если для этого класса или его предка установлен флаг компиляции {$М+}, иначе такой элемент будет иметь видимость public.

Для лучшей читаемости рекомендуется организовывать элементы класса в группы по их видимости, то есть расположить вместе все элементы с видимостью private, далее все элементы с видимостью protected и так далее. При таком способе группировки каждая директива, обозначающая видимость, употребляется только один раз, и показывает начало новой «секции» определения класса. Типичная декларация класса имеет вид:

Области видимости private, protected, public, published упорядочены по возрастанию видимости методов. В классах-потомках можно повысить видимость его элементов, но не понизить, Рассмотрим, как это правило действует отдельно по различным типам элементов класса. Для полей и методов при статическом перекрытии ограничение на изменение области видимости отсутствует, так как статическое перекрытие означает создание нового элемента класса со своей областью видимости. При виртуальном или динамическом перекрытии методов можно повышать видимость от protected к public. Понятно, что методы с видимостью private не видны в классе-потомке, и делать их виртуальными или динамическими бессмысленно. При понижении видимости виртуальных и динамических методов, компилятор выдаст предупреждение и оставит видимость неизменной.

Для свойств возможно повышение области видимости. Например, свойство, объявленное protected классе-потомке, может стать public или published. Естественно, что из области private достать свойство не представляется возможным. Понижение видимости для свойства невозможно, и при попытке понизить видимость, компилятор не оставит ее неизменной. То есть, элемент, объявленный published не может стать public в классе-потомке, а объявленный public не может стать private или protected. Процедура повышения видимости свойств широко практикуется в библиотек классов Delphi. У многих компонентов есть предок, который отличается только отсутствием опубликованных свойств.

Области видимости в С++

Элементы класса в С++ могут иметь следующие спецификаторы доступа:

Public элемент может быть использован любой функцией;

Private элемент может быть использован только функциями -элементами и «друзьями» класса, в котором он объявлен, понятие «друзей» класса будет рассмотрено далее; -

Protected - то же, что и private, но элемент может быть использован функциями элементами и друзьями классов, производных от объявленного класса. При объявлении производного класса можно задать спецификаторы доступа public или private перед классами-предками. Использовать в этом случае спецификатор protected нельзя.

Эти модификаторы не изменяют атрибутов доступа базовых элементов с точки зрения базового класса, но могут изменить атрибуты доступа базовых элементов с точки зрения производных классов. Производны класс наследует атрибуты базового класса следующим образом;

При этом имеет место понижение, а не повышение видимости.

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