Поделиться через


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

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

Основы контроль доступа

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

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

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

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

Примечание.

Описатель protected доступа не используется в F#, хотя это допустимо, если вы используете типы, созданные на языках, поддерживающих protected доступ. Таким образом, если переопределить защищенный метод, метод остается доступным только в пределах класса и его потомков.

Описатель доступа помещается перед именем сущности.

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

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

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

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

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

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

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

Пример

В следующем коде показано использование описателей управления доступом. В проекте есть два файла и Module1.fsModule2.fs. Каждый файл является неявным модулем. Таким образом, существует два модуля и Module1Module2. Частный тип и внутренний тип определяются в 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

См. также