满足隐式接口的记录无需重新实现

时间:2014-09-10 16:20:05

标签: interface f# records

看到记录已经有一个公共的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

感谢

1 个答案:

答案 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!"