难以接受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
答案 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)
快速搜索谷歌和第一个结果:
http://bugsquash.blogspot.com/2009/01/implementing-interfaces-in-f.html http://cs.hubfs.net/forums/thread/7579.aspx
答案 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