Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-120.docx
Скачиваний:
46
Добавлен:
13.09.2019
Размер:
827.39 Кб
Скачать

66. Области видимости объектов. Управление жизненным циклом объектов при создании приложений.

Одной из важнейших характеристик переменных является область видимости. Область видимости (scope) переменных программы — это ряд операторов, в которых переменная видима. Переменная является видимой (visible) в операторе, если к переменной, входящей в оператор, можно обратиться. Правила обзора данных в языке определяют, как именно конкретное появление имени связано с переменной. В частности, правила обзора данных определяют, каким образом ссылки на переменные, объявленные вне выполняющейся в данный момент подпрограммы или блока, связаны с их объявлениями и, вследствие этого, с их атрибутами. Следовательно, для написания или чтения программ на данном языке необходимо полное знание этих правил.

Переменная является локальной в программной единице или блоке, если она там объявлена. Нелокальными переменными (nonlocal variables) программной единицы или блока называются переменные, которые видимы в этой программной единице или блоке, но не объявляются в них.

В модели объектов языка Object Pascal существует механизм доступа к составным частям объекта, определяющий области, где ими можно пользоваться (области видимости). Поля и методы могут относиться к четырем группам (секциям), отличающимся областями видимости. Методы и свойства могут быть общими (секция public), личными (секция private), защищенными (секция protected) и опубликованными (секция published). Есть еще и пятая группа, automated, она ранее использовалась для создания объектов СОМ; теперь она присутствует в языке только для обратной совместимости с программами на Delphi версий 3—5.

Области видимости, определяемые первыми тремя директивами, таковы.

  • Поля, свойства и методы секции public не имеют ограничений на видимость. Они доступны из других функций и методов объектов как в данном модуле, так и во всех прочих, ссылающихся на него.

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

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

Области видимости и жизненный цикл

Иногда область видимости и время жизни переменных оказываются связанными между собой. Рассмотрим, например, переменную, объявленную в процедуре языка Pascal, не содержащей вызовов подпрограмм. Область видимости такой переменной — от ее объявления до зарезервированного слова end в процедуре. Время жизни такой переменной начинается при входе в процедуру и заканчивается при достижении команды end (в языке Pascal нет оператора возврата). Хотя и очевидно, что область видимости и время жизни переменной не совпадают, поскольку статическая область видимости представляет собой буквальную, или пространственную, концепцию, а время жизни — концепция временная, в данном случае эти две концепции связаны между собой, или, по крайней мере, кажутся такими.

В других случаях связь между областью видимости и временем жизни переменной не настолько очевидна. В языках С и С++, например, переменная, объявленная в функции с использованием спецификатора static, статически связана с областью видимости этой функции и с памятью. Таким образом, ее область видимости статична и локальна по отношению к функции, но ее время жизни распространяется на все выполнение программы, частью которой она является. Область видимости и время жизни не связаны также при вызовах подпрограмм.