Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Wyrażenia obiektów (F#)

Klasy (F#)

Inne zasoby

Materiały referencyjne dotyczące języka F#