Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oop-VisualWorks.pdf
Скачиваний:
35
Добавлен:
13.02.2015
Размер:
1 Мб
Скачать
☆

3.5. Разделяемые переменные VisualWorks 7.4.1

59

странства имён. Одно из основных различие между классом в роли пространства имён и пространством имён состоит в том, что классы могут содержать только разделяемые переменные, являющиеся его переменными класса, которые в качестве значения не могут иметь пространство имён или другой класс.

3.5.Разделяемые переменные VisualWorks 7.4.1

Значением разделяемой переменной среды VisualWorks 7.4.1 может быть пространство имён, или класс, или любой другой объект. В последнем случае, разделяемые переменные играют роль, которую прежде играли глобальные переменные, переменные пула и переменные класса.

Разделяемая переменная, когда она определяется классом, заменяет реализацию переменной класса. Класс в этом случае служит пространством имён для такой разделяемой переменной. Как переменная класса такая разделяемая переменная наследуется, и доступна для самого класса его экземпляров, его подклассов и их экземпляров. Это верно, даже если классы находятся в разных пространствах имён! Поэтому в этом случае явного импортирования не требуется.

Например, класс Date имеет разделяемую переменную (переменную класса) с именем MonthNames, которая хранит массив, содержащий имена всех 12 месяцев. Однажды определенный в разделяемой переменной массив доступен всем экземплярам класса Date и его подклассов, а также экземплярам любого другого класса, который импортирует разделяемую переменную MonthNames.

Разделяемые переменные могут определяться непосредственно в любом пространстве имён (не только в классе). Например, в пространстве имён Graphics определено много классов, и еще два пространства имён

SymbolicPaintConstants и TextConstants. Эти пространства имён (ранее, пулы) существуют исключительно как окружения видимости для наборов специальных разделяемых переменных (ранее, переменных пула). Каждая разделяемая переменная такого пространства имён определяется и инициализируется непосредственно в своем пространстве имён. Чтобы все эти переменные стали доступны в пределах другого пространства имён, соответствующее пространство имён (пул) должно быть импортировано туда операцией общего импорта.

Глобальные переменные в смысле классического Смолтока — пример плохой практики программирования в объектно-ориентированной среде, поскольку они нарушают принцип инкапсуляции. Вместо глобальных переменных, в VisualWorks 7.4.1 определяются разделяемые переменные в том пространстве имён, которое почти всегда доступно для всех других

60

Глава 3. Пространства имён

пространств. Например, ранее глобальная переменная Transcript определена как разделяемая переменная в пространстве имён Smalltalk.Core.

Разделяемые переменные теперь наделены свойствами. Можно установить значение разделяемой переменной и далее не изменять его (сделать переменную константой). При создании или импортировании, разделяемую переменную можно объявить как общую, или как частную. Если переменная определяется как общая (public), она доступна для импортирования пространством имён или классом. Если же она определяется как частная (private), то становится недоступной для импорта пространством имён или классом.

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

Когда разделяемая переменная удаляется, но, в то же время, ссылки на неё всё ещё существуют, или ссылка на переменную загружается (пакетом или модулем), но переменная не объявляется, её имя перемещается в пространство имён Undeclared. Это пространство имён поддерживается системой и в нормальных условиях не требует внимания со стороны программиста. Но знакомство с ним может оказаться полезным для выяснения причин некоторых видов ошибок в программе. Чтобы просмотреть содержимое пространства имён Undeclared, нужно его открыть в системном браузере как любое другое пространство имён или открыть на нём окно инспектора (Undeclared inspect).

Переменные добавляются в пространство Undeclared когда:

•во время загрузки из файла командой File In. . . (или по другим причинам) компилируется ссылка на несуществующую переменную;

•переменная удаляется, хотя на неё всё ещё существуют ссылки;

•удаляется класс (независимо от того, существуют ли извне ссылки на него или нет); такой механизм гарантирует, что любые внешние ссылки, которые всё ещё могут существовать, будет правильно восстановлены, если класс будет создан снова.

3.6. Контрольные вопросы

61

3.6.Контрольные вопросы

1)Что такое пространство имён?

2)Что представляет собой пул Smalltalk в реализациях VisualWorks без пространств имён и с пространствами имён?

3)Какое пространство имён является корнем всей иерархии пространств имён, а какое корнем для пространств имён смолтоковского кода?

4)Что такое разделяемая переменная? Что может быть значением разделяемой переменной?

5)Что значит объявить разделяемую переменную как общую или как частную?

6)Что такое точечная нотация?

7)Что такое импорт пространства имён? Какие два вида импорта пространства имён существуют в VisualWorks и в чём их различие?

8)Что такое импорт конкретного связывания?

9)Что представляет собой пространство имён Undeclared?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]