Podpisy (F#)
Podpis souboru obsahuje informace o veřejné podpisů sady F# prvky programu, jako je například moduly, obory názvů a typů.Lze určit usnadnění těchto prvků programu.
Poznámky
U každého F# kód souboru, můžete mít podpis souboru, což je soubor, který má stejný název jako soubor kód, ale s příponou .fsi namísto .fs.Soubory signatur lze přidat také do příkazového řádku, pokud jsou přímo pomocí příkazového řádku kompilace.Chcete-li rozlišovat mezi kód a soubory podpisů, kód soubory jsou někdy označovány jako provádění soubory.V projektu mělo předcházet podpis souboru soubor přidružený kód.
Podpis souboru popisuje obory názvů, moduly, typy a členy v příslušném souboru implementace.Pomocí informací v souboru určit části kódu v odpovídající provádění souboru lze přistupovat z kódu mimo soubor provádění a jaké části jsou interní implementace souboru.Obory názvů, modulů a typy, které jsou zahrnuty v souboru podpis musí být podmnožinou obory názvů, modulů a typy, které jsou zahrnuty v souboru provádění.S výjimkami zaznamenanými dále v tomto tématu považovány za soukromé souboru provádění těchto prvků jazyka, které nejsou uvedeny v podpisu souboru.Pokud žádný soubor podpisu je nalezen v projektu nebo příkazového řádku, se používá výchozí usnadnění.
Další informace o výchozím nastavení usnadnění, viz Řízení přístupu (F#).
V souboru nebudou opakovat implementace každou metodu nebo funkce a definice typů.Místo toho použijte podpis pro jednotlivé metody a funkce, která funguje jako kompletní specifikace funkce, které je implementováno fragmentu modulu nebo oboru názvů.Syntaxe pro typ podpisu je stejný jako v prohlášeních abstraktní metodu v rozhraní a abstraktní třídy a je rovněž uvedena technologie IntelliSense a fsi.exe interpret F# při zobrazení správně sestavený vstup.
Pokud není dostatek informací, podpis typu označující, zda je typ uzavřeny nebo zda je typu rozhraní, je třeba přidat atribut, označuje druh typu kompilátoru.V následující tabulce jsou popsány atributy, které pro tento účel použít.
Atribut |
Description |
---|---|
[<Sealed>] |
Pro typ, který nemá žádné abstraktní členy nebo která by neměla být rozšířena. |
[<Interface>] |
Pro typ, který je rozhraní. |
Kompilátor chybu produkuje, pokud atributy nejsou konzistentní podpis a prohlášení v provádění souboru.
Klíčové slovo val k vytvoření podpisu pro hodnotu nebo hodnotu funkce.Klíčové slovo type zavádí typ podpisu.
Podpis souboru lze generovat pomocí --sig volba kompilátoru.Obecně můžete zapisovat soubory .fsi ručně.Místo toho generovat pomocí kompilátoru .fsi soubory, přidat do projektu, pokud máte a upravovat odebráním metody a funkce, které nechcete být přístupné.
Existuje několik pravidel pro typ podpisy:
Typ zkratky v implementačním souboru nesmí odpovídat typu bez zkratku v souboru.
Záznamy a discriminated unií musí vystavit všechny nebo žádný z jejich polí a konstruktory a pořadí v podpisu musí odpovídat pořadí provádění souboru.Třídy lze odhalit některé, všechny nebo žádný z jejich pole a metody v podpisu.
Třídy a struktur, které mají konstruktory musí vystavit prohlášení o jejich základní třídy ( inherits prohlášení).Také třídy a struktur, které mají konstruktory musí vystavit všechny jejich abstraktní metody a rozhraní prohlášení.
Typy rozhraní musí odhalit jejich metody a rozhraní.
Pravidla pro podpisy hodnota jsou následující:
Modifikátory pro usnadnění (public, internal, a tak dále) a inline a mutable modifikátory v podpisu musí odpovídat názvům v implementaci.
Počet parametrů obecného typu (buď odvodit implicitně nebo explicitně deklarovány) musí odpovídat a typy a omezení typu obecný typ parametrů musí odpovídat.
Pokud Literal atribut použit, musí být uvedeny v podpisu a provádění a stejnou hodnotu literálu musí být pro oba použita.
Vzorek parametry (také známé jako Arita) implementace a podpisy musí být konzistentní.
Následující příklad kódu ukazuje příklad podpisu souboru, který má obor názvů, modul, hodnota funkce a podpisy typu spolu s odpovídající atributy.Ukazuje 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 provádění souboru.
namespace Library1
module Module1 =
let function1 x = x + 1
type Type1() =
member type1.method1() =
printfn "test1.method1"
member type1.method2() =
printfn "test1.method2"
[<Sealed>]
type Type2() =
member type2.method1() =
printfn "test1.method1"
member type1.method2() =
printfn "test1.method2"
[<Interface>]
type InterfaceType1 =
abstract member method1 : int -> int
abstract member method2 : string -> unit