Открытая коллекция знаний

OpenU.Ru

Справочник UML. Объектно-ориентированное проектирование.

access (доступ)

Зависимость, разрешающая одному пакету ссылаться на элементы другого пакета.
См. friend; import; visibility.

Семантика

Пакет (клиент), ссылающийся на элемент в другом пакете (поставщик), должен импортировать пакет, содержащий этот элемент. При этом между пакетом-клиентом и пакетом-поставщиком существуют отношения зависимости access или import. Вложенный пакет получает неявный доступ ко всем другим пакетам, импортированным его контейнером. Другими словами, вложенный пакет имеет доступ ко всему, к чему имеет доступ его пакет-контейнер.
Элемент пакета имеет доступ ко всем элементам, которые видимы в рамках этого пакета. Правила видимости можно описать следующим образом:

  • Элемент, определенный в некотором пакете, является видимым внутри этого пакета.
  • Если элемент является видимым внутри какого-то пакета, то он является видимым для всех вложенных в него пакетов.
  • Если один пакет имеет доступ к другому пакету или импортирует его, то все элементы, имеющие в другом пакете открытую видимость (public), будут видимыми и в импортирующем пакете.
  • Если один пакет является потомком другого пакета, то все элементы, имеющие в пакете-предке открытую видимость, будут видимыми и в пакете-потомке.
  • Зависимости импорта и доступа не транзитивны. Если элемент А "видит" элемент В, а В "видит" С, это не гарантирует, что элемент А "видит" элемент С.

Из этих правил следует, что пакет не может "видеть" содержимое собственных вложенных пакетов, если только он не имеет к ним явного доступа или если их содержимое не имеет открытую видимость.
Существует еще несколько правил видимости:

  • Содержимое классификатора (атрибуты, операции и вложенные классы) видимо внутри своего пакета только в том случае, если имеет открытую видимость внутри классификатора. Следует отметить, что видимостью неструктурированного содержимого подсистем управляют правила для пакетов, которые мы перечислили выше. Управление же атрибутами и операциями подсистемы осуществляется при помощи данного правила.
  • Содержимое классификатора видимо внутри классификатора-потомка в том случае, если оно имеет открытую или защищенную видимость.
  • Элементы классификатора "видят" все его содержимое, включая методы и конечные автоматы.

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

Нотация

Зависимость доступа изображается в виде пунктирной стрелки, наконечник которой расположен у пакета-клиента, а хвост - у пакета-поставщика. Стрелка должна быть помечена с помощью ключевого слова "access".

Обсуждение

На рис. 5 изображены отношения одноуровневого доступа между двумя пакетами. Пакет Р имеет доступ к пакету Q, при этом пакет Q не имеет доступа к пакету Р. Классы К и L в пакете Р могут "видеть" открытый класс М в пакете Q, но не закрытый класс N. Ни класс М. ни класс N не могут "видеть" классы пакета Р (даже класс К, обладающий открытой видимостью), так как у пакета Q нет доступа к пакету Р. Для того, чтобы класс был видимым для другого равно-уровневого пакета, он должен обладать открытой видимостью, а содержащий его пакет должен либо быть импортирован, либо доступен для другого пакета.

Рис. 5. Одноуровневый доступ
Рис. 5. Одноуровневый доступ
На рис. 6 вы видите уже более сложный пример для видимости и отношений доступа. Символы возле названий элементов указывают на тип видимости, которым обладает этот элемент (+ - открытый элемент, и # - защищенный, то есть видимый только потомкам, - - закрытый, то есть вообще невидимый вне своего пакета).

Рис. 6. Отношения доступа
Рис. 6. Отношения доступа
Класс А "видит" класс С и класс Е, потому что они находятся в его пакетах-контейнерах (Y и X).
Классы С и А "видят" класс D, потому что пакет Y импортирует пакет Z. Класс А вложен в пакет Y, поэтому может "видеть" все то же, что и он.
Классы А, С и Е "видят" класс В, потому что они вложены в пакет X, импортирующий пакет V, в котором содержится класс В. В то же время они не "видят" класс F, так как он, хотя и содержится в пакете V, обладает закрытой видимостью. Таким образом, класс К невидим за пределами пакета V.
Класс Е не может "видеть" класс D, так как тот находится в пакете Z, который не был импортирован пакетом X.
Класс С и класс Е не "видят" класс А, так как он находится и пакете U, который не был импортирован другими пакетами.
Классы В и F "видят" классы D и Е, так как те находятся в пакетах-контейнерах. Кроме того, они "видят" класс С из пакета Y, который был импортирован классом-контейнером X. Класс F обладает закрытой видимостью, но это не мешает ему "видеть" другие классы. Те - же, напротив, его не "видят".
Классы В и Р "видят" друг друга, так как они находятся в одном пакете. Закрытым класс F является только для "чужих" пакетов, но не для элементов своего собственного пакета.

Алфавитный указатель