看到记录已经有一个公共的Getter /(Setter)字段,是否可以指定记录满足匹配的接口而不重新实现它?
例如:
type IText =
abstract text : string with get,set
type TextRec =
{
mutable text : string
}
现在看到Record已经隐式实现了这个接口,我想把一个"继承IText"或者"接口IText" (没有身体)记录,但似乎我不能这样做。事实上,我认为我必须通过将其添加到记录中来重新实现接口:
interface IText with
member this.text
with get() = this.text
and set(v) = this.text <- v
感谢
答案 0 :(得分:7)
F#目前不支持隐式接口实现(甚至不支持类),但它是frequently requested features之一,所以它可能在将来发生。我当然明白为什么这会有用。
我认为没有任何好的解决方法 - 最好的选择可能是编写实现界面所需的额外代码。
如果你想冒险,可以尝试编写一个“包装”功能,从一个提供所需成员的值创建一个接口实现。使用静态成员约束,您可以要求成员在那里(没有实际实现接口):
type IText =
abstract Text : string with get, set
let inline wrap (a:^T) =
{ new IText with
member x.Text
with get() = (^T : (member Text : string) (a))
and set(v) = (^T : (member set_Text : string -> unit) (a, v)) }
静态成员约束(在wrap
的实现中使用)主要用于通用数值计算,因此这有点延伸(当然也是高级F#特性),但它可以解决这个问题: / p>
type Rect = { mutable Text : string }
let i = wrap { Text = "Hi" }
i.Text <- i.Text + " there!"