F # - Antarmuka

Antarmuka menyediakan cara abstrak untuk menulis detail implementasi kelas. Ini adalah template yang mendeklarasikan metode yang harus diterapkan dan diekspos oleh kelas secara publik.

Sintaksis

Antarmuka menentukan kumpulan anggota terkait yang diimplementasikan oleh kelas lain. Ini memiliki sintaks berikut -

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

Harap diperhatikan -

  • Dalam deklarasi antarmuka, anggota tidak diimplementasikan.

  • Anggotanya abstrak, dinyatakan oleh abstractkata kunci. Namun, Anda dapat menyediakan implementasi default menggunakandefault kata kunci.

  • Anda dapat mengimplementasikan antarmuka baik dengan menggunakan ekspresi objek atau dengan menggunakan tipe kelas.

  • Dalam implementasi kelas atau objek, Anda perlu menyediakan badan metode untuk metode abstrak antarmuka.

  • Kata kuncinya interface dan end, yang menandai awal dan akhir definisi, bersifat opsional.

Sebagai contoh,

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

Memanggil Metode Antarmuka

Metode antarmuka dipanggil melalui antarmuka, bukan melalui instance kelas atau antarmuka pelaksana tipe. Untuk memanggil metode antarmuka, Anda dapat mentransmisikan ke jenis antarmuka dengan menggunakan:> operator (operator upcast).

Sebagai contoh,

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

Contoh berikut menggambarkan konsep -

Contoh

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()

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

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

Pewarisan Antarmuka

Antarmuka dapat mewarisi dari satu atau lebih antarmuka dasar.

Contoh berikut menunjukkan konsep -

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

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

10
15
5