Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么我的抽象成员的实现不是公共的_F#_Abstract_Member - Fatal编程技术网

F# 为什么我的抽象成员的实现不是公共的

F# 为什么我的抽象成员的实现不是公共的,f#,abstract,member,F#,Abstract,Member,我花了大约一个小时的时间才把它编译好。一定是什么蠢事。你能认出它吗 在我的lib项目中: namespace TravelerStuff open System type Traveler = abstract GetData : unit -> unit type public DeltaTraveler() = interface Traveler with member v.GetData () = print

我花了大约一个小时的时间才把它编译好。一定是什么蠢事。你能认出它吗

在我的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)
[]让main=
let traveler=new TravelerStuff.DeltaTraveler()
traveler.GetData//此行不会编译:(未定义字段、构造函数或成员“GetData”)
您需要向上投射。在这种情况下,F#目前不会帮你

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

// open the namespace to reduce typing.

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

在许多面向对象的语言中, 向上投射是隐含的;在F#中 规则略有不同。 向上投射将自动应用 将参数传递给上的方法时 对象类型。然而,对于let bound来说 在模块中,向上投射是 非自动,除非参数 类型被声明为灵活类型。 有关详细信息,请参阅

你需要上抛。在这种情况下,F#目前不会帮你

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

// open the namespace to reduce typing.

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

在许多面向对象的语言中, 向上投射是隐含的;在F#中 规则略有不同。 向上投射将自动应用 将参数传递给上的方法时 对象类型。然而,对于let bound来说 在模块中,向上投射是 非自动,除非参数 类型被声明为灵活类型。 有关详细信息,请参阅

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

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

type DeltaTraveler() =    
  member v.GetData () = printf "hello"
  interface Traveler with
    member v.GetData () = v.GetData() 
此外,如果您只想实现一个接口,但不需要添加任何成员,则可以使用F#对象表达式(更轻量级):

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

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

type DeltaTraveler() =    
  member v.GetData () = printf "hello"
  interface Traveler with
    member v.GetData () = v.GetData() 
此外,如果您只想实现一个接口,但不需要添加任何成员,则可以使用F#对象表达式(更轻量级):