Podpisy
Soubor podpisu obsahuje informace o veřejných podpisech sady programových prvků jazyka F#, jako jsou typy, obory názvů a moduly. Dá se použít k určení přístupnosti těchto prvků programu.
Poznámky
Pro každý soubor kódu F# můžete mít soubor podpisu, což je soubor, který má stejný název jako soubor kódu, ale s příponou .fsi místo .fsi. Soubory podpisů lze také přidat do příkazového řádku kompilace, pokud používáte přímo příkazový řádek. K rozlišení souborů kódu a podpisových souborů se soubory kódu někdy označují jako implementační soubory. V projektu by soubor podpisu měl předcházet přidruženému souboru kódu.
Soubor podpisu popisuje obory názvů, moduly, typy a členy v odpovídajícím souboru implementace. Informace v souboru podpisu slouží k určení částí kódu v odpovídajícím souboru implementace, ke které lze přistupovat z kódu mimo implementační soubor a které části jsou interní pro implementační soubor. Obory názvů, moduly a typy, které jsou součástí souboru podpisu, musí být podmnožinou oborů názvů, modulů a typů, které jsou součástí souboru implementace. S některými výjimkami uvedenými dále v tomto tématu jsou prvky jazyka, které nejsou uvedeny v souboru podpisu, považovány za soukromé pro implementační soubor. Pokud se v projektu nebo příkazovém řádku nenajde žádný soubor podpisu, použije se výchozí přístupnost.
Další informace o výchozí přístupnosti najdete v tématu Řízení přístupu.
V souboru podpisu neopakujete definici typů a implementací každé metody nebo funkce. Místo toho použijete podpis pro každou metodu a funkci, která funguje jako úplná specifikace funkcí implementovaných modulem nebo fragmentem oboru názvů. Syntaxe podpisu typu je stejná jako v abstraktních deklarací metod v rozhraních a abstraktních třídách a je také zobrazena IntelliSense a interpretem jazyka F# fsi.exe, když zobrazuje správně zkompilovaný vstup.
Pokud v podpisu typu není dostatek informací, které indikují, zda je typ zapečetěn nebo zda se jedná o typ rozhraní, je nutné přidat atribut, který označuje povahu typu kompilátoru. Atributy, které používáte pro tento účel, jsou popsány v následující tabulce.
Atribut | Popis |
---|---|
[<Sealed>] |
Pro typ, který nemá žádné abstraktní členy nebo který by neměl být rozšířen. |
[<Interface>] |
Pro typ, který je rozhraní. |
Kompilátor vytvoří chybu, pokud atributy nejsou konzistentní mezi podpisem a deklarací v souboru implementace.
Pomocí klíčového slova val
vytvořte podpis pro hodnotu nebo hodnotu funkce. Klíčové slovo type
představuje podpis typu.
Soubor podpisu můžete vygenerovat pomocí možnosti kompilátoru --sig
. Obecně platí, že soubory .fsi nezapisujete ručně. Místo toho pomocí kompilátoru vygenerujete soubory .fsi, přidáte je do projektu, pokud ho máte, a upravíte je odebráním metod a funkcí, které nechcete mít přístup.
Pro podpisy typů existuje několik pravidel:
Zkratky typů v souboru implementace nesmí odpovídat typu bez zkratky v souboru podpisu.
Záznamy a diskriminované sjednocení musí zveřejnit buď všechna nebo žádná pole a konstruktory, a pořadí v podpisu musí odpovídat pořadí v souboru implementace. Třídy mohou odhalit některá, všechna nebo žádná pole a metody v podpisu.
Třídy a struktury, které mají konstruktory, musí vystavit deklarace jejich základních tříd (deklarace
inherits
). Třídy a struktury, které mají konstruktory, musí také vystavit všechny jejich abstraktní metody a deklarace rozhraní.Typy rozhraní musí odhalit všechny jejich metody a rozhraní.
Pravidla pro podpisy hodnot jsou následující:
Modifikátory pro přístupnost (
public
atdinternal
.) ainline
mutable
modifikátory v podpisu musí odpovídat modifikátorům v implementaci.Počet parametrů obecného typu (implicitně odvozených nebo explicitně deklarovaných) se musí shodovat a typy a omezení typů v parametrech obecného typu se musí shodovat.
Literal
Pokud se atribut použije, musí se objevit v podpisu i implementaci a pro oba musí být použita stejná hodnota literálu.Vzor parametrů (označovaný také jako arity) podpisů a implementací musí být konzistentní.
Pokud se názvy parametrů v souboru podpisu liší od odpovídajícího souboru implementace, použije se místo toho název v souboru podpisu, což může způsobit problémy při ladění nebo profilaci. Pokud chcete být upozorněni na takové neshody, povolte v souboru projektu upozornění 3218 nebo při vyvolání kompilátoru (viz
--warnon
část Možnosti kompilátoru).
Následující příklad kódu ukazuje příklad souboru podpisu, který má obor názvů, modul, hodnotu funkce a podpisy typů společně s příslušnými atributy. Zobrazuje také odpovídající soubor implementace.
// Module1.fsi
namespace Library1
module Module1 =
val function1 : int -> int
type Type1 =
new : unit -> Type1
member method1 : unit -> unit
member method2 : unit -> unit
[<Sealed>]
type Type2 =
new : unit -> Type2
member method1 : unit -> unit
member method2 : unit -> unit
[<Interface>]
type InterfaceType1 =
abstract member method1 : int -> int
abstract member method2 : string -> unit
Následující kód ukazuje soubor implementace.
namespace Library1
module Module1 =
let function1 x = x + 1
type Type1() =
member type1.method1() =
printfn "type1.method1"
member type1.method2() =
printfn "type1.method2"
[<Sealed>]
type Type2() =
member type2.method1() =
printfn "type2.method1"
member type2.method2() =
printfn "type2.method2"
[<Interface>]
type InterfaceType1 =
abstract member method1 : int -> int
abstract member method2 : string -> unit