Управление доступом

Контроль доступа означает объявление того, какие клиенты могут использовать определенные элементы программы, такие как типы, методы и функции.

Основы управления доступом

В F # описатели управления доступом public , internal и private могут применяться к модулям, типам, методам, определениям значений, функциям, свойствам и явным полям.

  • public Указывает, что доступ к сущности может осуществляться всеми вызывающими объектами.

  • internal Указывает, что доступ к сущности можно получить только из той же сборки.

  • private Указывает, что доступ к сущности можно получить только из включающего типа или модуля.

Примечание

Спецификатор доступа protected не используется в F #, хотя он допустим, если вы используете типы, созданные на языках, поддерживающих protected доступ. Поэтому при переопределении защищенного метода метод остается доступным только внутри класса и его потомков.

В общем случае описатель помещается перед именем сущности, за исключением случаев mutable inline , когда используется описатель или, который появляется после описателя управления доступом.

Если спецификатор доступа не используется, по умолчанию используется значение public , за исключением let привязок в типе, которые всегда имеют private тип.

Сигнатуры в F # предоставляют другой механизм управления доступом к программным элементам F #. Для управления доступом подписи не требуются. Дополнительные сведения см. в статье Сигнатуры.

Правила для контроля доступа

Управление доступом подчиняется следующим правилам.

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

  • Специальные возможности для отдельных вариантов в размеченного Union определяются уровнем доступности размеченного объединения. То есть конкретный вариант объединения не менее доступен, чем сам союз.

  • Специальные возможности для отдельных полей типа записи определяются специальными возможностями записи. Это означает, что конкретная метка записи не менее доступна, чем сама запись.

Пример

В следующем коде показано использование описателей управления доступом. В проекте есть два файла: Module1.fs и Module2.fs . Каждый файл является неявным модулем. Таким образом, существует два модуля: Module1 и Module2 . Частный тип и внутренний тип определяются в Module1 . Доступ к закрытому типу невозможен из Module2 , но внутренний тип может.

// Module1.fs

module Module1

// This type is not usable outside of this file
type private MyPrivateType() =
   // x is private since this is an internal let binding
   let x = 5
   // X is private and does not appear in the QuickInfo window
   // when viewing this type in the Visual Studio editor
   member private this.X() = 10
   member this.Z() = x * 100

type internal MyInternalType() =
   let x = 5
   member private this.X() = 10
   member this.Z() = x * 100

// Top-level let bindings are public by default,
// so "private" and "internal" are needed here since a
// value cannot be more accessible than its type.
let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()

// let bindings at the top level are public by default,
// so result1 and result2 are public.
let result1 = myPrivateObj.Z
let result2 = myInternalObj.Z

Следующий код проверяет доступность типов, созданных в Module1.fs .

// Module2.fs
module Module2

open Module1

// The following line is an error because private means
// that it cannot be accessed from another file or module
// let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()

let result = myInternalObj.Z

См. также