F#OOP - 实现接口 - 私有和方法名称问题

时间:2011-04-07 05:10:05

标签: c# .net interface f# interop

难以接受OOP接口F#问题。

示例 - 当我创建一个类并尝试实现单个方法时从接口IRunner的命名空间示例中运行(字符串,字符串,字符串) 我可以在.NET Reflector中看到真正创建的是一个名为Example-IRunner-Run的私有方法(字符串,字符串,字符串)如果我想将它暴露回C#lib,则会出现问题。通过反射 - 我无法控制的代码只是寻找一个带有公共Run方法的类。我该如何解决?似乎找不到任何关于此的文件。

问题1 - 运行应该公开一些如何结束私人
问题2 - 疯狂的长方法名称 - 而不仅仅是运行

不确定我是否需要使用某些修饰符关键字或签名文件....不只是从(1)私有开始,以及(2)奇怪的方法名称(反射将找不到)< / p>

注意:在此示例中,Run返回一个int
在当前的实现中,我只是试图将1返回到“概念证明”,我可以在F#中做这个简单的事情

示例代码:

namespace MyRunnerLib

open Example

type MyRunner() = class
  interface IRunner with 
   member this.Run(s1, s2, s3) = 1
end

3 个答案:

答案 0 :(得分:3)

此外,还有一些选项如何写这个。 Robert的版本在附加成员中具有实际实现。如果将实现放入界面中,则可以避免强制转换 (另请注意,您不需要class .. end个关键字):

type MyRunner() = 
  member this.Run(a,b,c) = 1
  interface IRunner with 
    member this.Run(a,b,c) = this.Run(a,b,c)

稍微更清楚的方法是将功能定义为本地功能,然后将其导出两次:

type MyRunner() = 
  // Implement functionality as loal members
  let run (a, b, c) = 1

  // Export all functionality as interface & members
  member this.Run(a,b,c) = run (a, b, c)
  interface IRunner with 
    member this.Run(a,b,c) = run (a, b, c)

答案 1 :(得分:1)

答案 2 :(得分:1)

Euphorics答案中的第一个链接包含解决方案。作为参考,我将在此重申。您需要使用您感兴趣的方法在类上实现转发成员。这是因为接口在F#中显式实现,而在C#中,默认是隐式接口实现。在你的情况下:

namespace MyRunnerLib

open Example

type MyRunner() = class
  interface IRunner with 
   member this.Run(s1, s2, s3) = 1
  member this.Run(s1, s2, s3) = (this :> IRunner).Run(s1,s2,s3)
end