F # - Giao diện

Các giao diện cung cấp một cách trừu tượng để viết lên các chi tiết triển khai của một lớp. Nó là một khuôn mẫu khai báo các phương thức mà lớp phải triển khai và hiển thị công khai.

Cú pháp

Một giao diện chỉ định tập hợp các thành viên liên quan mà các lớp khác thực hiện. Nó có cú pháp sau:

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

Xin lưu ý -

  • Trong một khai báo giao diện, các thành viên không được thực hiện.

  • Các thành viên là trừu tượng, được khai báo bởi abstracttừ khóa. Tuy nhiên, bạn có thể cung cấp một triển khai mặc định bằng cách sử dụngdefault từ khóa.

  • Bạn có thể triển khai các giao diện bằng cách sử dụng các biểu thức đối tượng hoặc bằng cách sử dụng các loại lớp.

  • Trong triển khai lớp hoặc đối tượng, bạn cần cung cấp các thân phương thức cho các phương thức trừu tượng của giao diện.

  • Các từ khóa interfaceend, đánh dấu phần đầu và phần cuối của định nghĩa, là tùy chọn.

Ví dụ,

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

Gọi phương thức giao diện

Các phương thức giao diện được gọi thông qua giao diện, không phải thông qua thể hiện của lớp hoặc giao diện thực thi kiểu. Để gọi một phương thức giao diện, bạn lên kiểu giao diện bằng cách sử dụng:> nhà điều hành (upcast operator).

Ví dụ,

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

Ví dụ sau minh họa khái niệm -

Thí dụ

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

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

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

Kế thừa giao diện

Các giao diện có thể kế thừa từ một hoặc nhiều giao diện cơ sở.

Ví dụ sau đây cho thấy khái niệm -

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

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

10
15
5