Třídy (F#)
Třídy jsou typy, které představují objekty, které mohou mít vlastnosti, metody a události.
// Class definition:
type [access-modifier] type-name [type-params] [access-modifier] ( parameter-list ) [ as identifier ] =
[ class ]
[ inherit base-type-name(base-constructor-args) ]
[ let-bindings ]
[ do-bindings ]
member-list
...
[ end ]
// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...
Poznámky
Třídy představují základní popis.Typy objektů ČISTÉ; Třída je primární pojem, který podporuje objektově orientované programování v F#.
V předchozím syntaxe type-name je libovolný platný identifikátor.type-params Popisuje obecný typ volitelné parametry.Obsahuje názvy parametrů typu a omezení uzavřít do lomených závorek (< a >).Další informace naleznete v tématu Generics (F#) a Omezení (F#).parameter-list Popisuje parametry konstruktoru.První modifikátor přístupu se vztahuje k typu; druhý se vztahuje k primární konstruktor.V obou případech se ve výchozím nastavení je public.
Určit základní třídu pro třídu pomocí inherit klíčové slovo.Je nutné zadat argumenty, v závorkách, konstruktor základní třídy.
Prohlásit pole nebo hodnoty, které jsou místní třídy pomocí funkce let vazby a postupujte podle obecných pravidel pro let vazby.do-bindings Část obsahuje kód vykonávaná při vytváření objektů.
member-list Obsahuje další konstruktory, instance a statickou metodu prohlášení, prohlášení rozhraní, abstraktní vazby a vlastnost a událost prohlášení.Jsou popsány v Členy (F#).
identifier Používané s nepovinné as klíčové slovo dá název proměnné instance nebo vlastní identifikátor, který lze použít v definici typu k odkazu na instanci typu.Další informace naleznete dále v tomto tématu v části identifikátory Self.
Klíčová slova class a end , označit začátek a Konec definice jsou volitelné.
Vzájemně propojeny rekurzivní typů, které jsou typy, které vzájemně spolu s and jako vzájemně rekurzivní funkce jsou klíčové slovo.Příklad naleznete v části vzájemně rekurzivní typy.
Konstruktory
Konstruktor je kód, který vytvoří instanci třídy typu.Konstruktory tříd trochu jinak pracovat v F# než v jiných.NET jazyků.F# třídy, je vždy primární konstruktoru, jejichž argumenty, které jsou popsány v parameter-list , následuje název typu a jejíž hlavní část tvoří let (a let rec) vazby na začátku deklarace třídy a do vazby, které následují.Argumenty konstruktoru primární jsou v rozsahu celé deklaraci třídy.
Můžete přidat další konstruktory pomocí new klíčové slovo, které chcete přidat člena, takto:
new(argument-list) = constructor-body
Těla konstruktoru new musí vyvolat primární konstruktoru, zadané v horní části deklarace třídy.
Následující příklad ilustruje tento koncept.V následujícím kódu MyClass má dvě konstruktory, primární konstruktor, který trvá dva argumenty a jiného konstruktoru, který nevyžaduje žádné argumenty.
type MyClass1(x: int, y: int) =
do printfn "%d %d" x y
new() = MyClass1(0, 0)
Nechť a proveďte vazby
let a do vazby v definici třídy tvoří těla konstruktoru třídy primární, a proto mohou spustit při každém vytvoření instance třídy.Pokud let vazby je funkce, pak je zkompilován člen.Pokud let vazby je hodnota, která není použit v jakékoli funkci nebo člena a poté zkompilován proměnnou, která je místní konstruktoru.Jinak je kompilován do pole Třída.do Výrazy, které následují jsou zkompilovány do primární konstruktor a spustit inicializační kód pro každou instanci.Protože všechny další konstruktory vždy volat konstruktor primární let vazby a do vazby vždy spouštět nezávisle se nazývá konstruktor.
Pole, která vytváří let vazby je přístupná v rámci metody a vlastnosti třídy; však jsou přístupná ze statické metody, i když statické metody přijmout jako parametr proměnné instance.Jsou přístupná pomocí self identifikátor, pokud existuje.
Vlastní identifikátory
A vlastní identifikátor je název, který představuje aktuální instance.Identifikátory Self vypadat this klíčové slovo v jazyce C# nebo C++ nebo Me v jazyce Visual Basic.Můžete definovat vlastní identifikátor dvěma různými způsoby v závislosti na tom, zda má vlastní identifikátor v oboru pro definici třídy celé nebo pouze pro jednotlivé metody.
Chcete-li definovat vlastní identifikátor pro celou třídu, použijte as klíčové slovo po pravých závorek parametr konstruktoru seznamu a zadejte název identifikátoru.
Chcete-li definovat vlastní identifikátor pouze jednu metodu poskytují vlastní identifikátor v deklaraci členské těsně před název metody a tečky (.) jako oddělovač.
Následující příklad kódu ukazuje dva způsoby vytvoření vlastní identifikátor.V prvním řádku as klíčové slovo se používá k definování vlastní identifikátor.V pátém řádku identifikátor this se používá k definování vlastní identifikátor, jehož rozsah je omezen na metodu PrintMessage.
type MyClass2(dataIn) as self =
let data = dataIn
do
self.PrintMessage()
member this.PrintMessage() =
printf "Creating MyClass2 with Data %d" data
Na rozdíl od v ostatních.NET jazyků můžete pojmenovat vlastní identifikátor však chcete; není nemůžete názvy jako self, Me, nebo this.
Vlastní identifikátor, který je deklarován s as klíčové slovo není inicializována až po let vazby jsou provedeny.Proto nelze použít v let vazby.Můžete použít vlastní identifikátor v do oddílu vazby.
Obecné parametry typu
Obecný typ ukazatele jsou stanoveny v lomených závorkách (< a >), ve formě jednoduché uvozovky, následuje identifikátor.Více parametrů obecného typu jsou odděleny čárkami.Obecný typ parametru je v oboru v celém prohlášení.Následující příklad kódu ukazuje, jak zadat parametry obecného typu.
type MyGenericClass<'a> (x: 'a) =
do printfn "%A" x
Argumenty typu jsou odvodit při použití typu.Následující kód je inferred typu posloupnosti n-tic.
let g1 = MyGenericClass( seq { for i in 1 .. 10 -> (i, i*i) } )
Určující dědění
inherit Klauzule označuje Přímá základní třída, pokud existuje.F# je povolena pouze jedna přímá základní třída.Třída implementuje rozhraní nejsou považovány za základní třídy.V rozhraní jsou popsána Rozhraní (F#) téma.
Metody a vlastnosti základní třídy můžete přistupovat z odvozené třídy pomocí klíčových slov jazyka base jako identifikátor, následuje tečka (.) a název člena.
Další informace naleznete v tématu Dědičnost (F#).
Oddíl členové
V této části můžete definovat statické nebo instanci metody, vlastnosti, implementace rozhraní, abstraktní členy, prohlášení událostí a další konstruktory.Nechť a proveďte vazby nelze v této části.Protože členy mohou být přidány do různých typů F# vedle tříd, jsou uvedeny v samostatné téma Členy (F#).
Vzájemně rekurzivní typy
Při definování typů, které se vzájemně odkazovat cyklický způsobem je řetězec společně definice typu pomocí and klíčové slovo.and Nahradí klíčové slovo type klíčové slovo vše kromě první definice takto.
open System.IO
type Folder(pathIn: string) =
let path = pathIn
let filenameArray : string array = Directory.GetFiles(path)
member this.FileArray = Array.map (fun elem -> new File(elem, this)) filenameArray
and File(filename: string, containingFolder: Folder) =
member this.Name = filename
member this.ContainingFolder = containingFolder
let folder1 = new Folder(".")
for file in folder1.FileArray do
printfn "%s" file.Name
Výstup je seznam všech souborů v aktuálním adresáři.
Použití třídy, odborů, záznamy a struktury
Uvedeny různé typy, musíte mít dobrou znalost co každý typ je určen pro vyberte vhodný typ pro konkrétní situaci.Třídy jsou navrženy pro použití v objektově orientovaném programování kontextech.Objektově orientované programování je dominantní paradigma v aplikacích, které jsou napsány pro.NET Framework.Pokud má váš kód F# úzce spolupracovat se.NET Framework nebo jiné objektové knihovny a zejména v případě, že máte rozšířit z orientované na objekt typu systému, jako je například knihovna uživatelského rozhraní, třídy jsou pravděpodobně vhodné.
Pokud jste se není spolupráce úzce s kódem objektově orientované nebo psaní kódu, který je samostatné a proto chráněn před častou interakci s kódem objektově orientované, zvažte použití záznamů a discriminated unií.Jediné, dobře thought–out discriminated unie spolu s odpovídající kód porovnávání, lze často použít jednodušší alternativou hierarchie v objektu.Další informace o discriminated odborů, viz Discriminated unií (F#).
Výhodou je jednodušší než třídy jsou záznamy, ale záznamy nejsou vhodné požadavky typu překročení, co bylo lze provést jejich jednoduchost.Záznamy jsou v podstatě jednoduché souhrnných hodnot bez samostatné konstruktory, které mohou provádět vlastní akce, bez skrytých polí a bez implementace dědičnost nebo rozhraní.Členů jako vlastnosti a metody lze přidat záznamy tak, aby jejich chování složitější, ale pole záznamu uloženy jsou stále jednoduchých souhrnných hodnot.Další informace o záznamech, viz Záznamy (F#).
Struktury jsou užitečné pro malé agregace dat, ale pokud se liší od třídy a záznamů, že jsou.ČISTÁ hodnota typy.Třídy a záznamy jsou.NET referenční typy.Sémantika typy hodnotu a odkaz se liší, že typy hodnot jsou předány hodnotou.To znamená, že jsou zkopírovány bit pro bit předán jako parametr nebo vrácená z funkce.Jsou také uloženy v zásobníku nebo, pokud jsou použita jako pole vložit do nadřazeného objektu místo uloženy v jejich vlastní samostatné umístění na haldy.Struktury jsou proto vhodné pro často používané datové problém při přístupu k haldy režii.Další informace o strukturách, viz Struktury (F#).