F # - Schnittstellen

Schnittstellen bieten eine abstrakte Möglichkeit, die Implementierungsdetails einer Klasse aufzuschreiben. Es ist eine Vorlage, die die Methoden deklariert, die die Klasse implementieren und öffentlich verfügbar machen muss.

Syntax

Eine Schnittstelle gibt die Gruppen verwandter Mitglieder an, die andere Klassen implementieren. Es hat die folgende Syntax -

// 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

Bitte beachten Sie -

  • In einer Schnittstellendeklaration sind die Mitglieder nicht implementiert.

  • Die Mitglieder sind abstrakt, deklariert von der abstractStichwort. Sie können jedoch eine Standardimplementierung mithilfe von bereitstellendefault Stichwort.

  • Sie können Schnittstellen entweder mithilfe von Objektausdrücken oder mithilfe von Klassentypen implementieren.

  • Bei der Klassen- oder Objektimplementierung müssen Sie Methodenkörper für abstrakte Methoden der Schnittstelle bereitstellen.

  • Die Schlüsselwörter interface und end, welche den Anfang und das Ende der Definition markieren, sind optional.

Zum Beispiel,

type IPerson =
   abstract Name : string
   abstract Enter : unit -> unit
   abstract Leave : unit -> unit

Aufrufen von Schnittstellenmethoden

Schnittstellenmethoden werden über die Schnittstelle aufgerufen, nicht über die Instanz der Klasse oder des Typs, der die Schnittstelle implementiert. Um eine Schnittstellenmethode aufzurufen, können Sie mithilfe von:> Operator (Upcast-Operator).

Zum Beispiel,

(s :> IPerson).Enter()
(s :> IPerson).Leave()

Das folgende Beispiel veranschaulicht das Konzept -

Beispiel

type IPerson =
   abstract Name : string
   abstract Enter : unit -> unit
   abstract Leave : unit -> unit

type Student(name : string, id : int) =
   member this.ID = id
   interface IPerson with
      member this.Name = name
      member this.Enter() = printfn "Student entering premises!"
      member this.Leave() = printfn "Student leaving premises!"

type StuffMember(name : string, id : int, salary : float) =
   let mutable _salary = salary

   member this.Salary
      with get() = _salary
      and set(value) = _salary <- value

   interface IPerson with
      member this.Name = name
      member this.Enter() = printfn "Stuff member entering premises!"
      member this.Leave() = printfn "Stuff member leaving premises!"

let s = new Student("Zara", 1234)
let st = new StuffMember("Rohit", 34, 50000.0)

(s :> IPerson).Enter()
(s :> IPerson).Leave()
(st :> IPerson).Enter()
(st :> IPerson).Leave()

Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:

Student entering premises!
Student leaving premises!
Stuff member entering premises!
Stuff member leaving premises!

Vererbung der Schnittstelle

Schnittstellen können von einer oder mehreren Basisschnittstellen erben.

Das folgende Beispiel zeigt das Konzept -

type Interface1 =
   abstract member doubleIt: int -> int

type Interface2 =
   abstract member tripleIt: int -> int

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

type multiplierClass() =
   interface Interface3 with
      member this.doubleIt(a) = 2 * a
      member this.tripleIt(a) = 3 * a
      member this.printIt(a) = a.ToString()

let ml = multiplierClass()
printfn "%d" ((ml:>Interface3).doubleIt(5))
printfn "%d" ((ml:>Interface3).tripleIt(5))
printfn "%s" ((ml:>Interface3).printIt(5))

Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:

10
15
5