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