F# 为什么我的抽象成员的实现不是公共的
我花了大约一个小时的时间才把它编译好。一定是什么蠢事。你能认出它吗 在我的lib项目中: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
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#对象表达式(更轻量级):