gpt4 book ai didi

f# - 在 F# 中实现 C# 接口(interface)

转载 作者:行者123 更新时间:2023-12-01 06:32:39 24 4
gpt4 key购买 nike

我在C#中有如下界面

public interface IDog
{
String Bark();
}

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

type GermanShepherd() = 
interface IDog with
member this.Bark() = "Woof"

但是当我添加一个不属于接口(interface)的支持功能时:

type GermanShepherd() = 
interface IDog with
member this.Bark() = "Woof"
member this.Eat() = "Yummy"

编译器提示:

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*

有没有一种方法可以使用实现接口(interface)的类型来实现私有(private)/内部函数,而这些函数不是接口(interface)的一部分?我无法更改我的“真实”应用程序中的接口(interface) b/c 还有其他实现该接口(interface)的项目。我在 MSDN 上找到的所有示例都没有这种特殊情况。

最佳答案

interface block 应该只包含属于接口(interface)的函数,但您可以在 block 之前放置其他函数:

type GermanShepherd() = 
member this.Eat() = "Yummy"
interface IDog with
member this.Bark() = "Woof"

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

type GermanShepherd() = 
let eat() = "Yummy"
interface IDog with
member this.Bark() = "Woof"

另外请注意,F# 目前只允许 explicit 接口(interface)实现,这意味着您可以将 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

解决此问题的一种方法是将Bark 方法显式添加为interface block 的单独成员outside。虽然有F# language issue也是为了这个!

关于f# - 在 F# 中实现 C# 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23913254/

24 4 0
文章推荐: java - List list = Database.getAllData(); 是什么类型的列表?