Řízení přístupu
Řízení přístupu odkazuje na deklarování, které klienti mohou používat určité prvky programu, jako jsou typy, metody a funkce.
Základy řízení přístupu
V jazyce F# lze specifikátory public
řízení přístupu , internal
a private
lze je použít pro moduly, typy, metody, definice hodnot, funkce, vlastnosti a explicitní pole.
public
označuje, že k entitě mají přístup všichni volající.internal
označuje, že k entitě lze přistupovat pouze ze stejného sestavení.private
označuje, že k entitě lze přistupovat pouze z nadřazeného typu nebo modulu.
Poznámka:
Specifikátor protected
přístupu se v jazyce F# nepoužívá, i když je přijatelný, pokud používáte typy vytvořené v jazycích, které podporují protected
přístup. Proto pokud přepíšete chráněnou metodu, zůstane vaše metoda přístupná pouze v rámci třídy a jejích sestupných.
Specifikátor přístupu se umístí před název entity.
Pokud není použit žádný specifikátor přístupu, výchozí hodnota je public
, s výjimkou let
vazeb v typu, které jsou vždy private
k typu.
Podpisy v jazyce F# poskytují další mechanismus pro řízení přístupu k prvkům programu jazyka F#. Podpisy nejsou vyžadovány pro řízení přístupu. Další informace najdete v tématu Podpisy.
Pravidla pro řízení přístupu
Řízení přístupu podléhá následujícím pravidlům:
Deklarace dědičnosti (tj. použití
inherit
k určení základní třídy pro třídu), deklarací rozhraní (tj. určení, že třída implementuje rozhraní) a abstraktní členy mají vždy stejnou přístupnost jako uzavírací typ. Proto nelze u těchto konstruktorů použít specifikátor řízení přístupu.Přístupnost jednotlivých případů v diskriminovaném sjednocení je určena přístupností samotné diskriminované unie. To znamená, že konkrétní případ sjednocení není méně přístupný než samotná unie.
Přístupnost jednotlivých polí typu záznamu je určena přístupností samotného záznamu. To znamená, že popisek konkrétního záznamu není méně přístupný než samotný záznam.
Příklad
Následující kód znázorňuje použití specifikátorů řízení přístupu. V projektu jsou dva soubory a Module1.fs
Module2.fs
. Každý soubor je implicitně modulem. Proto existují dva moduly, Module1
a Module2
. Soukromý typ a interní typ jsou definovány v Module1
. Privátní typ nelze získat přístup z Module2
, ale interní typ může.
// 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
Následující kód testuje přístupnost typů vytvořených v Module1.fs
souboru .
// 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