在F#中实现C#接口

Jam*_*xon 3 f#

我在C#中有以下界面

public interface IDog
{
    String Bark();
}
Run Code Online (Sandbox Code Playgroud)

我想在F#中创建一个实现.我对此没有任何问题:

type GermanShepherd() = 
        interface IDog with
            member this.Bark() = "Woof"
Run Code Online (Sandbox Code Playgroud)

但是当我添加一个不属于界面的支持函数时,如下所示:

type GermanShepherd() = 
        interface IDog with
            member this.Bark() = "Woof"
            member this.Eat() = "Yummy" 
Run Code Online (Sandbox Code Playgroud)

编译抱怨:

Error   1   No abstract or interface member was found that corresponds to this override 
Error   2   This value is not a function and cannot be applied*
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以实现私有/内部函数的类型实现接口而不将这些函数作为接口的一部分?我无法在我的"真实"应用程序中更改界面b/c还有其他实现该界面的项目.我找到的MSDN上的所有示例都没有这个特定的场景.

Tom*_*cek 10

interface块应仅包含作为接口一部分的函数,但您可以在块之前放置其他函数:

type GermanShepherd() = 
    member this.Eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"
Run Code Online (Sandbox Code Playgroud)

如果您不需要公共成员,那么您可以使用私有let-bound函数:

type GermanShepherd() = 
    let eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"
Run Code Online (Sandbox Code Playgroud)

另请注意,F#目前只允许显式接口实现,这意味着您可以GermanShepherd视为IDog,但您不会IDog明确地看到成员:

let g = GermanShepherd()
g.Eat()            // OK
g.Bark()           // Error, interface members are implemented explicitly
let d = g :> IDog  // To 'Bark', we need to get 'IDog' first
d.Bark()           // OK
Run Code Online (Sandbox Code Playgroud)

一种解决方法是将Bark方法显式添加为块的单独成员interface.虽然这也有F#语言问题!