hac*_*sid 1 f# member abstract
我一直在努力让这个编译大约一个小时.它一定是愚蠢的东西.你能发现它吗?
在我的lib项目中:
namespace TravelerStuff
open System
type Traveler =
abstract GetData : unit -> unit
type public DeltaTraveler() =
interface Traveler with
member v.GetData () =
printf "hello"
Run Code Online (Sandbox Code Playgroud)
并在我的控制台测试应用程序:
[<EntryPoint>] let main _ =
let traveler = new TravelerStuff.DeltaTraveler()
traveler.GetData // this line won't compile: (The field, constructor or member 'GetData' is not defined)
Run Code Online (Sandbox Code Playgroud)
正如gradbot所说,在搜索成员时,F#当前不会隐式地将值转换为接口.此外,F#仅使用显式接口实现(从C#中已知)而不是隐式实现,其中成员不仅被编译为接口的实现,而且还被编译为该类型的普通(直接可见)成员.
除了强制转换,您可以在类型定义中复制成员:
type DeltaTraveler() =
member v.GetData () = printf "hello"
interface Traveler with
member v.GetData () = v.GetData()
Run Code Online (Sandbox Code Playgroud)
此外,如果您只想实现一个接口,但不需要添加任何成员,则可以使用F#对象表达式(更轻量级):
let deltaTraveler() =
{ new Traveler with
member v.GetData () = printf "hello" }
// The function directly returns value of type 'Traveler'
let t = deltaTraveler()
t.GetData()
Run Code Online (Sandbox Code Playgroud)