Interfejsy (F#)
Interfejsy określić zestawy powiązane elementy członkowskie, które implementują innych klas.
// 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
Uwagi
Deklaracje interfejsu przypominają deklaracje klas, z wyjątkiem, że członkowie nie są implementowane.Zamiast tego, wszyscy członkowie są abstrakcyjny, wskazywane przez słowo kluczowe abstract.Treść metody nie przewidują metody abstrakcyjne.Jednakże można zapewnić Domyślna implementacja poprzez również tym odrębnej definicji członka jako metoda wraz z default słowa kluczowego.Zaawansowana tak jest odpowiednikiem Tworzenie wirtualnego metoda w klasie bazowej w innych.Języki netto.Wirtualne metoda może być zastąpiona klas, które implementują interfejs.
Istnieją dwa sposoby zaimplementowania interfejsów: przy użyciu wyrażeń obiektu i przy użyciu typu klasy.W każdym przypadku wyrażenie typu lub obiekt klasy zawiera treść metody dla metody abstrakcyjne interfejsu.Implementacje są specyficzne dla każdego typu, która implementuje interfejs.W związku z tym metody interfejsu na różnych typach może różnić się od siebie.
Słowa kluczowe interface i end, który oznaczyć początek i koniec definicji, są opcjonalne, użycie składni lekkie.Jeśli nie używasz tych słów kluczowych, kompilator próbuje rozpoznać, czy typ jest przez analizowanie konstrukcje, które można użyć klasy lub interfejsu.Jeśli określenie członka lub użyj składni inne klasy, typ jest interpretowana jako klasy.
.NET, styl programowania jest zacząć wszystkich interfejsów z kapitałem I.
Implementowanie interfejsów przy użyciu typu klasy
W polu Typ klasy można zaimplementować jeden lub więcej interfejsów, przy użyciu interface słowa kluczowego, nazwa interfejsu oraz with słowa kluczowego, następuje definicje Członkowskie interfejsu, jak pokazano w poniższym kodzie.
type IPrintable =
abstract member Print : unit -> unit
type SomeClass1(x: int, y: float) =
interface IPrintable with
member this.Print() = printfn "%d %f" x y
Implementacje interfejsu są dziedziczone, dzięki czemu nie muszą ich przeprojektowywać żadnych klas pochodnych.
Wywołanie metody interfejsu
Metody interfejsu może być wywołana tylko za pośrednictwem interfejsu, nie za pośrednictwem dowolnego obiektu typu, która implementuje interfejs.W ten sposób, może zajść potrzeba rozszerzające do typu interfejsu za pomocą :> operatora lub upcast operatora w celu wywołania tych metod.
Wywołanie metody interfejsu, gdy obiekt typu SomeClass, jak pokazano w poniższym kodzie, musi rozszerzające obiektu typu interfejsu.
let x1 = new SomeClass1(1, 2.0)
(x1 :> IPrintable).Print()
Alternatywą jest zadeklarowanie metody obiektu tego upcasts i wywołuje metodę interfejsu, jak w poniższym przykładzie.
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()
Implementowanie interfejsów przy użyciu wyrażeń obiektu
Obiekt wyrażeń pozwalają krótkie implementować interfejs.Są one przydatne, gdy nie trzeba utworzyć typ nazwany, a jedynie chcesz obiekt, który obsługuje metody interfejsu, bez żadnych dodatkowych metod.Poniższy kod ilustruje wyrażenie typu object.
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()
Dziedziczenie interfejsu
Interfejsy może dziedziczyć po jednej lub kilku interfejsach podstawowych.
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