我有一个棘手的错误。
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#做的只是能够解决名称不明确地告诉编译器,名称是从动物类派生的成员?
在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
。
另一种选择是使用抽象类 ,而不是一个接口的:
[<AbstractClass>]
type Animal () =
abstract Name : string
type Dog (name) =
inherit Animal()
override dog.Name = name
let pluto = Dog("Pluto")
let name = pluto.Name