0 people like it.

Pimpl

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
51: 
52: 
53: 
54: 
55: 
56: 
57: 
58: 
59: 
60: 
61: 
62: 
63: 
64: 
65: 
66: 
type IGameScreenVirtuals = 
    abstract Update : unit -> string
     
type IGameScreen =
    abstract Prop : string
    abstract Virtuals : IGameScreenVirtuals

                 
let createGameScreenBase () =
    let prop = ref "GameScreen.Prop"
    (fun virtuals ->
        { new IGameScreen with
            member o.Prop = !prop
            member o.Virtuals = virtuals }), fun p -> prop := p
     
let createLoadingScreen () =
    let createBase, setProp = createGameScreenBase ()
    setProp "LoadingScreen.Prop"     
    createBase 
        { new IGameScreenVirtuals with
            member o.Update() = "LoadingScreen.Update" }
    

type IMenuScreenVirtuals = 
    abstract OnCancel : unit -> string
     
type IMenuScreen =
    abstract GameScreen : IGameScreen
    abstract Virtuals : IMenuScreenVirtuals
     
let createMenuScreenBase ()  =
    let createGameBase, setProp = createGameScreenBase ()
    setProp "MenuScreen.Prop"
    (fun gameMethods ->
        { new IMenuScreen with
            member o.GameScreen = createGameBase gameMethods
            member o.Virtuals = 
                { new IMenuScreenVirtuals with
                    member o.OnCancel() = "MenuScreen.OnCancel" } }), setProp
     
let createPauseMenuScreen () =
    let createMenuBase, setProp = createMenuScreenBase ()
    setProp "PauseMenuScreen.Prop"
    createMenuBase 
        { new IGameScreenVirtuals with
            member o.Update() = "pauseMenuScreen.Update" }
     
module Example =
    let gameScreens : IGameScreen[] = [| createLoadingScreen (); (createPauseMenuScreen ()).GameScreen|]
     
    let testGameScreens (screens : IGameScreen[]) =
        for gs in screens do
            gs.Prop |> printfn "%s"
            gs.Virtuals.Update () |> printfn "%s"
     
    testGameScreens gameScreens
     
    let menuScreens : IMenuScreen[] = [| createPauseMenuScreen () |]
     
    let testMenuScreens (screens: IMenuScreen[]) =
        for ms in screens do
            ms.GameScreen.Prop |> printfn "%s"
            ms.GameScreen.Virtuals.Update () |> printfn "%s"
            ms.Virtuals.OnCancel () |> printfn "%s"
     
    testMenuScreens menuScreens
abstract member IGameScreenVirtuals.Update : unit -> string

Full name: Script.IGameScreenVirtuals.Update
type unit = Unit

Full name: Microsoft.FSharp.Core.unit
Multiple items
val string : value:'T -> string

Full name: Microsoft.FSharp.Core.Operators.string

--------------------
type string = System.String

Full name: Microsoft.FSharp.Core.string
type IGameScreen =
  interface
    abstract member Prop : string
    abstract member Virtuals : IGameScreenVirtuals
  end

Full name: Script.IGameScreen
abstract member IGameScreen.Prop : string

Full name: Script.IGameScreen.Prop
abstract member IGameScreen.Virtuals : IGameScreenVirtuals

Full name: Script.IGameScreen.Virtuals
type IGameScreenVirtuals =
  interface
    abstract member Update : unit -> string
  end

Full name: Script.IGameScreenVirtuals
val createGameScreenBase : unit -> (IGameScreenVirtuals -> IGameScreen) * (string -> unit)

Full name: Script.createGameScreenBase
val prop : string ref
Multiple items
val ref : value:'T -> 'T ref

Full name: Microsoft.FSharp.Core.Operators.ref

--------------------
type 'T ref = Ref<'T>

Full name: Microsoft.FSharp.Core.ref<_>
val virtuals : IGameScreenVirtuals
val o : IGameScreen
property IGameScreen.Prop: string
property IGameScreen.Virtuals: IGameScreenVirtuals
val p : string
val createLoadingScreen : unit -> IGameScreen

Full name: Script.createLoadingScreen
val createBase : (IGameScreenVirtuals -> IGameScreen)
val setProp : (string -> unit)
val o : IGameScreenVirtuals
abstract member IGameScreenVirtuals.Update : unit -> string
type IMenuScreenVirtuals =
  interface
    abstract member OnCancel : unit -> string
  end

Full name: Script.IMenuScreenVirtuals
abstract member IMenuScreenVirtuals.OnCancel : unit -> string

Full name: Script.IMenuScreenVirtuals.OnCancel
type IMenuScreen =
  interface
    abstract member GameScreen : IGameScreen
    abstract member Virtuals : IMenuScreenVirtuals
  end

Full name: Script.IMenuScreen
abstract member IMenuScreen.GameScreen : IGameScreen

Full name: Script.IMenuScreen.GameScreen
abstract member IMenuScreen.Virtuals : IMenuScreenVirtuals

Full name: Script.IMenuScreen.Virtuals
val createMenuScreenBase : unit -> (#IGameScreenVirtuals -> IMenuScreen) * (string -> unit)

Full name: Script.createMenuScreenBase
val createGameBase : (IGameScreenVirtuals -> IGameScreen)
val gameMethods : #IGameScreenVirtuals
val o : IMenuScreen
property IMenuScreen.GameScreen: IGameScreen
property IMenuScreen.Virtuals: IMenuScreenVirtuals
val o : IMenuScreenVirtuals
abstract member IMenuScreenVirtuals.OnCancel : unit -> string
val createPauseMenuScreen : unit -> IMenuScreen

Full name: Script.createPauseMenuScreen
val createMenuBase : (IGameScreenVirtuals -> IMenuScreen)
module Example

from Script
val gameScreens : IGameScreen []

Full name: Script.Example.gameScreens
val testGameScreens : screens:IGameScreen [] -> unit

Full name: Script.Example.testGameScreens
val screens : IGameScreen []
val gs : IGameScreen
val printfn : format:Printf.TextWriterFormat<'T> -> 'T

Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
val menuScreens : IMenuScreen []

Full name: Script.Example.menuScreens
val testMenuScreens : screens:IMenuScreen [] -> unit

Full name: Script.Example.testMenuScreens
val screens : IMenuScreen []
val ms : IMenuScreen
Raw view Test code New version

More information

Link:http://fssnip.net/aT
Posted:14 years ago
Author:
Tags: