Sdílet prostřednictvím


Ří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 , internala 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.fsModule2.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.fssouboru .

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

Viz také