我在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#语言问题!
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |