53 lines
1.6 KiB
Forth
53 lines
1.6 KiB
Forth
module Interfaces
|
|
|
|
// You can implement one or more interfaces in a class type by using the interface keyword,
|
|
// the name of the interface, and the with keyword, followed by the interface member definitions,
|
|
// as shown in the following code.
|
|
type IPrintable =
|
|
abstract member Print : unit -> unit
|
|
abstract member MyReadOnlyProperty :int
|
|
|
|
type SomeClass1(x: int, y: float) =
|
|
interface IPrintable with
|
|
member this.Print() = printfn "%d %f" x y
|
|
member this.MyReadOnlyProperty = 10
|
|
|
|
// To call the interface method when you have an object of type SomeClass,
|
|
// you must upcast the object to the interface type, as shown in the following code.+
|
|
let x1 = new SomeClass1(1, 2.0)
|
|
(x1 :> IPrintable).Print()
|
|
|
|
|
|
// An alternative is to declare a method on the object that upcasts and calls the interface method,
|
|
// as in the following example.
|
|
type SomeClass2(x: int, y: float) =
|
|
member this.Print() = (this :> IPrintable).Print()
|
|
interface IPrintable with
|
|
member this.Print() = printfn "%d %f" x y
|
|
member this.MyReadOnlyProperty = 10
|
|
|
|
let x2 = new SomeClass2(1, 2.0)
|
|
x2.Print()
|
|
|
|
// Interface Inheritance
|
|
type Interface0 = interface
|
|
abstract member Method1 : int -> int
|
|
end
|
|
|
|
// Interface Inheritance
|
|
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 |