为什么我的抽象成员的实现不公开

时间:2011-06-12 23:30:32

标签: f# abstract member

我一直在努力让这个编译大约一个小时。它一定是愚蠢的东西。你能发现它吗?

在我的lib项目中:

namespace TravelerStuff
open System

type Traveler =         
    abstract GetData : unit -> unit

type public DeltaTraveler() =
    interface Traveler with
         member v.GetData () =

        printf "hello"

并在我的控制台测试应用中:

[<EntryPoint>] let main _ =
    let traveler = new TravelerStuff.DeltaTraveler()
    traveler.GetData // this line won't compile: (The field, constructor or member 'GetData' is not defined)

2 个答案:

答案 0 :(得分:6)

正如gradbot所说,在搜索成员时,F#当前不会隐式地将值转换为接口。此外,F#仅使用显式接口实现(从C#中已知)而不是隐式实现,其中成员不仅被编译为接口的实现,而且还被编译为普通(直接)可见的)类型的成员。

除了强制转换,您还可以在类型定义中复制成员:

type DeltaTraveler() =    
  member v.GetData () = printf "hello"
  interface Traveler with
    member v.GetData () = v.GetData() 

此外,如果您只想实现一个接口,但不需要添加任何成员,则可以使用F#对象表达式(更轻量级):

let deltaTraveler() =
  { new Traveler with
      member v.GetData () = printf "hello" }

// The function directly returns value of type 'Traveler'
let t = deltaTraveler()
t.GetData()

答案 1 :(得分:3)

你需要向上倾斜。在这种情况下,F#目前不会为你做这件事。

(traveler :> TravelerStuff.Traveler).GetData()

// open the namespace to reduce typing.

open TravelerStuff
(traveler :> Traveler).GetData()

Snip from F# docs.

  

在许多面向对象的语言中,   倾向是隐含的;在F#中,   规则略有不同。   上传自动应用   当您将参数传递给方法时   对象类型。但是,对于让我们来说   模块中的函数,向上转换是   不自动,除非参数   type被声明为灵活类型。   有关详细信息,请参阅Flexible Types (F#)

相关问题