Interface 满足隐式接口且不重新实现的记录

Interface 满足隐式接口且不重新实现的记录,interface,f#,records,Interface,F#,Records,看到一个记录的字段已经有一个公共Getter/(Setter),是否可以指定一个记录满足匹配接口而不重新实现它 例如: type IText = abstract text : string with get,set type TextRec = { mutable text : string } 现在看到记录已经隐式地实现了这个接口,我想在记录上添加一个“inherit IText”或“interface IText”(没有正文),但似乎我不能这样做。事实上,我认为我必须通过

看到一个记录的字段已经有一个公共Getter/(Setter),是否可以指定一个记录满足匹配接口而不重新实现它

例如:

type IText = 
    abstract text : string with get,set

type TextRec = 
{ 
mutable text : string
}
现在看到记录已经隐式地实现了这个接口,我想在记录上添加一个“inherit IText”或“interface IText”(没有正文),但似乎我不能这样做。事实上,我认为我必须通过将以下内容添加到记录中来重新实现接口:

interface IText with
    member this.text
        with get()  = this.text
        and set(v)  = this.text <- v
将IText与
请参阅本文件
使用get()=this.text
和set(v)=this.textF#目前不支持隐式接口实现(甚至不支持类),但它是其中之一,因此将来可能会发生。我当然明白为什么这会有用

我不认为有任何好的解决方法,最好的选择可能是编写实现接口所需的额外代码

如果您想冒险,可以尝试编写一个“包装”函数,从提供所需成员的值创建接口实现。使用静态成员约束,可以要求成员在那里(而不实际实现接口):

静态成员约束(在
wrap
的实现中使用)主要用于一般的数值计算,因此这有点牵强(当然是一个高级的F#特性),但它有以下作用:

type Rect = { mutable Text : string }
let i = wrap { Text = "Hi" }
i.Text <- i.Text + " there!"
type Rect={mutable Text:string}
设i=wrap{Text=“Hi”}

i、 正确的文本。在F#中没有隐式接口实现。我不是在问接口的隐式实现,它(至少在F#中没有提到)是关于是否需要在调用站点命名接口。我想明确地将编译器提供的协议标记为实现接口,而不重新实现它,这是不同的。我明白,即使我可以按照我的要求去做,我仍然需要检查类型并使用downcast。我认为@Daniel的意思是F#中没有自动接口实现,就像你的问题一样。我想我曾经看到过一个关于这个特性的建议……说得很清楚,这里已经有了这个特定接口的实现,因为它是一个带有可变字段的记录——我只是想告诉编译器,现有的实现与我的接口兼容。虽然,例如,没有成员体的“interface IText”是有意义的,但我非常确定我不能这样做——只是确保我没有遗漏边缘大小写语法。谢谢…c#中没有隐式或显式接口实现。正确的术语是隐式或显式接口成员实现。在c#中,除非显式声明,否则类型无法实现接口,尽管接口的任何数量的成员都可以隐式实现。在f#中,正如其他人所指出的,隐式接口成员实现不受支持。我已经有一段时间没有躲在这里了,我很高兴看到你仍然在回答问题。。。我已经选择了静态duck输入方式,但是我想我可能错过了什么,所以我只是检查一下。[Arg-继续点击Enter并尽早发布…]我想知道是否值得为这些包装使用线程本地单例,这样它们就不会在每个包装上创建垃圾。(我猜在这个简单的例子中,它可以是一个全局的、共享的包装器。)当然,我真正想要的是F#-in-F#元编程调用优化编译器,而不是使用漂亮的语法宏Eval,这样我们就可以添加我们想要的任何功能:)抱歉-我的上一条评论将您的包装器和我的内联帮助器版本合并在一起,没有引用-显然,您需要在整个过程中保持目标。我需要咖啡-可惜已经太晚了。。。
type Rect = { mutable Text : string }
let i = wrap { Text = "Hi" }
i.Text <- i.Text + " there!"