F #-인터페이스

인터페이스는 클래스의 구현 세부 사항을 작성하는 추상적 인 방법을 제공합니다. 클래스가 구현하고 공개적으로 노출해야하는 메서드를 선언하는 템플릿입니다.

통사론

인터페이스는 다른 클래스가 구현하는 관련 멤버 집합을 지정합니다. 다음과 같은 구문이 있습니다.

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

참고-

  • 인터페이스 선언에서 멤버는 구현되지 않습니다.

  • 회원은 추상적이며 abstract예어. 그러나 다음을 사용하여 기본 구현을 제공 할 수 있습니다.default 예어.

  • 객체 표현식을 사용하거나 클래스 유형을 사용하여 인터페이스를 구현할 수 있습니다.

  • 클래스 또는 개체 구현에서 인터페이스의 추상 메서드에 대한 메서드 본문을 제공해야합니다.

  • 키워드 interfaceend, 정의의 시작과 끝을 표시하는 것은 선택 사항입니다.

예를 들면

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

인터페이스 메서드 호출

인터페이스 메서드는 클래스의 인스턴스 나 인터페이스를 구현하는 형식이 아닌 인터페이스를 통해 호출됩니다. 인터페이스 메서드를 호출하려면 다음을 사용하여 인터페이스 유형으로 캐스트합니다.:> 운영자 (업 캐스트 운영자).

예를 들면

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

다음 예제는 개념을 보여줍니다-

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

프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.

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

인터페이스 상속

인터페이스는 하나 이상의 기본 인터페이스에서 상속 할 수 있습니다.

다음 예제는 개념을 보여줍니다-

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

프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.

10
15
5