我正在尝试为某些windows api函数创建一个"包装器"模块user32.dll.我还在学习F#所以我对F#中的继承和多态如何工作以及如何将其应用于这种情况非常模糊.
我有这个模块:
module MouseControl =
[<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
extern void ShowCursor(bool show)
[<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
extern void internal mouse_event(int flags, int dX, int dY, int buttons, int extraInfo)
let MouseEvent(flags, dX, dY, buttons, extraInfo) = mouse_event(flags, dX, dY, buttons, extraInfo)
Run Code Online (Sandbox Code Playgroud)
我的目标是能够mouse_event从使用该模块的其他代码中"隐藏"该函数,而不是将该函数公开为MouseEvent.有了这个代码都 mouse_event和MouseEvent目前可调用该模块代码.如何隐藏mouse_event模块的私有位置?
在您的代码示例中,您已将mouse_event函数标记为internal- 因此原则上,您只需要将其标记为private.但是,看起来F#编译器忽略了extern成员的可见性注释,因此最简单的选择是将它们放在嵌套模块中并隐藏整个嵌套模块:
module MouseControl =
module private Imported =
[<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo)
let MouseEvent(flags, dX, dY, buttons, extraInfo) =
Imported.mouse_event(flags, dX, dY, buttons, extraInfo)
Run Code Online (Sandbox Code Playgroud)
该模块Imported现在仅在MouseControl模块内可见.从外面看,你无法进入任何内部MouseControl.Imported.