Dědičnost (F#)
Dědičnost slouží k modelování vztahů "je a nebo vytvoření podtypů v objektově orientovaném programování.
Určení vztahy dědičnosti
Určete vztahy dědičnosti pomocí inherit klíčové slovo v deklaraci třídy.Základní syntaktické formy je znázorněno v následujícím příkladu.
type MyDerived(...) =
inherit MyBase(...)
Třída může mít nejvýše jeden Přímá základní třída.Pokud nezadáte ani základní třídy pomocí inherit klíčové slovo, třída dědí implicitně z Object.
Zděděné členy
Pokud třída dědí z jiné třídy, metody a členy základní třídy jsou k dispozici uživatelům odvozené třídy jako kdyby byly přímo členy odvozené třídy.
Všechny vazby umožňují a parametry konstruktoru soukromých do třídy a proto nelze získat přístup z odvozených tříd.
Klíčové slovo base je k dispozici v odvozených tříd a odkazuje na instanci základní třídy.Používá se jako self-identifier.
Virtuální metody a lokální změny
Virtuální metody (a vlastnosti) pracovat odlišným F# v porovnání s ostatní.NET jazyků.Chcete-li deklarovat nového člena virtuální použít abstract klíčové slovo.To lze provést bez ohledu na to, zda poskytují výchozí implementace metody.Tedy takto úplnou definici virtuální metoda v základní třídě tohoto vzoru:
abstractmembermethod-name : type
defaultself-identifier.method-nameargument-list = method-body
A v odvozené třídě lokálními této virtuální metody tohoto vzoru:
overrideself-identifier.method-nameargument-list = method-body
Vynecháte-li výchozí implementace v základní třídě, bude základní třídu abstraktní třídy.
Následující příklad kódu ukazuje prohlášení nové virtuální metody function1 v základní třídě a jak přepsat v odvozené třídě.
type MyClassBase1() =
let mutable z = 0
abstract member function1 : int -> int
default u.function1(a : int) = z <- z + a; z
type MyClassDerived1() =
inherit MyClassBase1()
override u.function1(a: int) = a + 1
Konstruktory a dědičnost
V odvozené třídě musí volat konstruktor základní třídy.Argumentů pro konstruktor základní třídy se zobrazí v seznamu argumentů v inherit klauzule.Hodnoty, které budou použity, musí být stanovena z argumenty zadané do konstruktoru třídy odvozené.
Následující kód ukazuje základní třída a odvozené třídy odvozené třídy kde volá konstruktor základní třídy v klauzuli Zdědit:
type MyClassBase2(x: int) =
let mutable z = x * x
do for i in 1..z do printf "%d " i
type MyClassDerived2(y: int) =
inherit MyClassBase2(y * 2)
do for i in 1..y do printf "%d " i
Následující kód lze použít u více konstruktory.První řádek odvozené třídy inherit klauzule a pole se zobrazí jako explicitní polí, které jsou deklarovány pomocí val klíčové slovo.Další informace naleznete v explicitní polí: val klíčové slovo.
type BaseClass =
val string1 : string
new (str) = { string1 = str }
new () = { string1 = "" }
type DerivedClass =
inherit BaseClass
val string2 : string
new (str1, str2) = { inherit BaseClass(str1); string2 = str2 }
new (str2) = { inherit BaseClass(); string2 = str2 }
let obj1 = DerivedClass("A", "B")
let obj2 = DerivedClass("A")
Alternativy k dědičnosti
V případech, kdy je požadováno dílčí změny typu zvažte použití výrazu objektu jako alternativu k dědičnosti.Následující příklad ukazuje použití výrazu objektu jako alternativu k vytvoření nového typu odvozené:
open System
let object1 = { new Object() with
override this.ToString() = "This overrides object.ToString()"
}
printfn "%s" (object1.ToString())
Další informace o výrazech objektu, viz Objektové výrazy (F#).
Při vytváření objektu hierarchie, zvažte použití discriminated unie namísto dědičnosti.Discriminated sdružení mohou také různé objekty, které sdílejí společný typ celkové chování modelu lišily.Jeden discriminated unie často vyloučit potřebu počet odvozených tříd, které jsou malým změnám.Informace o sdružení discriminated Rozlišovaná sjednocení (F#).