Sdílet prostřednictvím


Rozhraní (F#)

Rozhraní zadat sady členů souvisejících, které implementují jiných tříd.

// Interface declaration:
[ attributes ]
type interface-name =
   [ interface ]
     [ inherit base-interface-name ...]
     abstract member1 : [ argument-types1 -> ] return-type1
     abstract member2 : [ argument-types2 -> ] return-type2
     ...
   [ end ]

// Implementing, inside a class type definition:
interface interface-name with
   member self-identifier.member1 argument-list = method-body1
   member self-identifier.member2 argument-list = method-body2

// Implementing, by using an object expression:
[ attributes ]
let class-name (argument-list) =
   { new interface-name with
       member self-identifier.member1 argument-list = method-body1
       member self-identifier.member2 argument-list = method-body2
       [ base-interface-definitions ]
   }
   member-list

Poznámky

Rozhraní prohlášení připomínají deklarace třídy s výjimkou, že jsou prováděny žádné členy.Místo toho jsou všechny členy abstraktní, podle klíčového slova abstract.Tělo metody neposkytují pro abstraktní metody.Výchozí implementace však můžete poskytnout také včetně samostatné definice členu jako metoda spolu s default klíčové slovo.Je ekvivalentní k vytvoření virtuální metoda v základní třídě v ostatních.NET jazyků.Třídy, které implementují rozhraní může být přepsána virtuální metody.

Implementovat rozhraní dvěma způsoby: pomocí výrazů objektu a pomocí typy tříd.V obou případech obsahuje výraz typu nebo objekt třídy subjekty metodu pro abstraktní metody rozhraní.Implementace jsou specifické pro každý typ, který implementuje rozhraní.Proto metody rozhraní na různých typech lišit od ostatních.

Klíčová slova interface a end, které označení začátku a konce definice, jsou při použití syntaxe lehký volitelné.Pomocí těchto klíčových slov, kompilátor pokusí odvodit, zda je typu třídy nebo rozhraní analýzou konstrukce, které používáte.Definovat člen nebo jiné třídy syntaxi použít, typ interpretována jako třída.

Na.Styl kódování NET je začít s velké všechna rozhraní I.

Pomocí třídy typy implementace rozhraní

Jedno nebo více rozhraní typu Třída lze implementovat pomocí interface klíčové slovo, název rozhraní a with klíčové slovo, následovaný členské definice rozhraní, viz následující kód.

type IPrintable =
   abstract member Print : unit -> unit

type SomeClass1(x: int, y: float) =
   interface IPrintable with
      member this.Print() = printfn "%d %f" x y

Implementace rozhraní se dědí všechny odvozené třídy není proto nutné k jejich reimplement.

Volání metody rozhraní

Metody rozhraní lze volat pouze prostřednictvím rozhraní, nikoli pomocí libovolného objektu typu, která implementuje rozhraní.Proto bude pravděpodobně nutné povýšení na typ rozhraní pomocí :> operátor nebo upcast operátor pro volání těchto metod.

K volání metody rozhraní, pokud je objekt typu SomeClass, jak je znázorněno v následujícím kódu se musí povýšení objekt na typ rozhraní.

let x1 = new SomeClass1(1, 2.0)
(x1 :> IPrintable).Print()

Alternativou je deklarovat metodu objektu této upcasts a volá metodu rozhraní, jako v následujícím příkladu.

type SomeClass2(x: int, y: float) =
   member this.Print() = (this :> IPrintable).Print()
   interface IPrintable with
      member this.Print() = printfn "%d %f" x y

let x2 = new SomeClass2(1, 2.0)
x2.Print()

Implementace rozhraní pomocí výrazů objektu

Objekt výrazy umožňují krátké implementovat rozhraní.Jsou užitečné při vytvoření pojmenovaného typu nemáte a chcete objekt, který podporuje metody rozhraní bez jakékoli další metody.Výraz objektu je znázorněno v následujícím kódu.

let makePrintable(x: int, y: float) =
    { new IPrintable with
              member this.Print() = printfn "%d %f" x y }
let x3 = makePrintable(1, 2.0) 
x3.Print()

Dědičnost rozhraní

Rozhraní může dědit z jedné nebo více základních rozhraní.

type Interface1 =
    abstract member Method1 : int -> int

type Interface2 =
    abstract member Method2 : int -> int

type Interface3 =
    inherit Interface1
    inherit Interface2
    abstract member Method3 : int -> int

type MyClass() =
    interface Interface3 with
        member this.Method1(n) = 2 * n
        member this.Method2(n) = n + 100
        member this.Method3(n) = n / 10

Viz také

Referenční dokumentace

Objekt výrazy (F#)

Třídy (F#)

Další zdroje

F# Language Reference