F#和接口实现的成员(F# and interface-implemented members)

2019-07-18 23:15发布

我有一个棘手的错误。

type Animal =

    abstract member Name : string

type Dog (name : string) =

    interface Animal with

        member this.Name : string =
            name

let pluto = new Dog("Pluto")
let name = pluto.Name

最后一行,特别是“名称”生成编译器错误认为“域,构造或元件‘名称’未定义”。

我使用的解决方法是编写

let name = (pluto :> Animal).Name

然而,这是很烦人的,并创建了大量的视觉噪音。 有什么人能在F#做的只是能够解决名称不明确地告诉编译器,名称是从动物类派生的成员?

Answer 1:

在F#中,当你实现一个接口,它的等效在C#中显式接口实现 。 也就是说,你可以通过接口调用的方法,而不是直接通过类。

关于接口F#参考文章表明并称做的向上转型到类型的方法:

type Dog (name : string) =

    member this.Name = (this :> Animal).Name

    interface Animal with
        member this.Name : string = name

或者,由丹尼尔的建议,你可以做到这一点的其他方式,这意味着你能够避免投:

type Dog (name : string) =

    member this.Name = name

    interface Animal with
        member this.Name : string = this.Name

此外,净约定接口的名字是与启动它们I ,所以你的界面应该叫IAnimal



Answer 2:

另一种选择是使用抽象类 ,而不是一个接口的:

[<AbstractClass>]
type Animal () =
    abstract Name : string

type Dog (name) = 
    inherit Animal()
    override dog.Name = name

let pluto = Dog("Pluto")
let name = pluto.Name


文章来源: F# and interface-implemented members