Hozzáférés-vezérlés
A hozzáférés-vezérlés azt jelenti, hogy mely ügyfelek használhatnak bizonyos programelemeket, például típusokat, metódusokat és függvényeket.
A hozzáférés-vezérlés alapjai
Az F#-ban a hozzáférés-vezérlési azonosítók , internal
és private
alkalmazhatók public
modulokra, típusokra, metódusokra, értékdefiníciókra, függvényekre, tulajdonságokra és explicit mezőkre.
public
azt jelzi, hogy az entitás minden hívó számára elérhető.internal
azt jelzi, hogy az entitás csak ugyanabból a szerelvényből érhető el.private
azt jelzi, hogy az entitás csak a belefoglaló típusból vagy modulból érhető el.
Feljegyzés
A hozzáférés-meghatározó protected
nem használatos az F#-ban, bár elfogadható, ha olyan nyelveken írt típusokat használ, amelyek támogatják protected
a hozzáférést. Ezért ha felülbírál egy védett metódust, a metódus csak az osztályon és a leszármazottakon belül marad elérhető.
A hozzáférés-meghatározó az entitás neve elé kerül.
Ha nem használ hozzáférési azonosítót, az alapértelmezett érték public
a típushoz tartozó kötések kivételével let
, amelyek mindig private
a típushoz tartoznak.
Az F#-ban lévő aláírások egy másik mechanizmust biztosítanak az F# programelemekhez való hozzáférés szabályozásához. A hozzáférés-vezérléshez nem szükséges aláírás. További információ: Aláírások.
Hozzáférés-vezérlési szabályok
A hozzáférés-vezérlésre a következő szabályok vonatkoznak:
Az öröklési deklarációk (vagyis az osztály alaposztályának
inherit
megadása), a felületi deklarációk (vagyis annak meghatározása, hogy egy osztály egy felületet implementál), és az absztrakt tagok mindig ugyanolyan akadálymentességgel rendelkeznek, mint a beágyazási típus. Ezért ezeken a szerkezeteken nem használható hozzáférés-vezérlési meghatározó.A hátrányos megkülönböztetést alkalmazó unió egyes eseteinek hozzáférhetőségét maga a hátrányos megkülönböztetést alkalmazó unió akadálymentessége határozza meg. Vagyis egy adott uniós ügy nem kevésbé hozzáférhető, mint maga az unió.
A rekordtípus egyes mezőinek akadálymentességét maga a rekord akadálymentessége határozza meg. Vagyis egy adott rekordcímke nem kevésbé hozzáférhető, mint maga a rekord.
Példa
Az alábbi kód bemutatja a hozzáférés-vezérlési azonosítók használatát. A projektben két fájl található, Module1.fs
és Module2.fs
a . Minden fájl implicit módon modul. Ezért két modul van, Module1
és Module2
. A privát típus és a belső típus a következőben van definiálva Module1
: . A privát típus nem érhető el innen Module2
, de a belső típus igen.
// 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
Az alábbi kód a létrehozott Module1.fs
típusok akadálymentességét teszteli.
// 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