Kontrola dostępu (F#)

Kontrola dostępu do odnosi się do deklarowania, których klienci mogą korzystać z niektórych elementów programów, takich jak typy, metod i funkcje.

Podstawowe informacje o kontroli dostępu

F# kontroli specyfikatory dostępu public, internal, i private można stosować do modułów, typy, metod, definicje wartości, funkcji, właściwości i pól jawne.

  • publicWskazuje, że podmiot jest możliwy dla wszystkich wywołań.

  • internalWskazuje, że podmiot jest możliwy tylko z tego samego zestawu.

  • privateWskazuje, że podmiot jest możliwy tylko z moduł lub typ otaczający.

[!UWAGA]

Specyfikator dostępu protected nie jest używany w F#, chociaż jest dopuszczalne, jeśli używasz typów napisane w językach, które obsługują protected dostępu.W związku z tym jeśli można zastąpić metody chronione, metodę pozostaje dostępna tylko wewnątrz klasy i jej kontrolek pochodnych.

Ogólnie rzecz biorąc, specyfikatora jest umieszczana na początku nazwy podmiotu, z wyjątkiem sytuacji gdy mutable lub inline używane specyfikatora, które występują po specyfikatora dostępu.

Jeśli używany jest nie specyfikatora dostępu, wartością domyślną jest public, z wyjątkiem let powiązania typu, które są zawsze private do typu.

Podpisy w F# zapewniają innego mechanizmu kontroli dostępu do elementów programu F#.Podpisy nie są wymagane do kontroli dostępu.Aby uzyskać więcej informacji, zobacz Podpisy (F#).

Zasady dotyczące kontroli dostępu

Kontrola dostępu jest z zastrzeżeniem następujących zasad:

  • Deklaracje dziedziczenie (oznacza to, że wykorzystanie inherit określić klasą bazową dla klasy), interfejsu deklaracji (które określając, że klasy implementuje interfejs) i abstrakcyjne członkowie mają zawsze ten sam ułatwień dostępu jako typ otaczający.W związku z tym specyfikatora dostępu nie można używać na tych konstrukcji.

  • Indywidualnych przypadków w dyskryminowanych Unii nie może mieć własne oddzielnie od typu Unii Modyfikatory kontroli dostępu.

  • Poszczególne pola typ rekordu nie może mieć własne Modyfikatory kontroli dostępu oddzielnie od typu rekordu.

Przykład

Poniższy kod ilustruje użycie specyfikatorów dostępu.Istnieją dwa pliki w programie project, Module1.fs i Module2.fs.Każdy plik jest niejawnie moduł.Dlatego istnieją dwa moduły, Module1 i Module2.Typ prywatnego i wewnętrzny typ są zdefiniowane w Module1.Typ prywatny nie jest dostępny z Module2, ale typu wewnętrznego można.

// 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

Poniższy kod badania dostępności typów, utworzone w 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

Zobacz też

Inne zasoby

Materiały referencyjne dotyczące języka F#

Podpisy (F#)