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

问题描述

我一直在努力使其编译大约一个小时。这一定是愚蠢的。你能发现吗? 在我的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)
    

解决方法

        您需要上投。在这种情况下,F#目前不会为您执行此操作。
(traveler :> TravelerStuff.Traveler).GetData()

// open the namespace to reduce typing.

open TravelerStuff
(traveler :> Traveler).GetData()
从F#文档中摘录。   在许多面向对象的语言中,   上隐是隐含的;在F#中,   规则略有不同。   上行自动应用   当您将参数传递给方法时   对象类型。但是,对于束缚   功能在模块中,向上转换是   不是自动的,除非参数   type被声明为灵活类型。   有关更多信息,请参见灵活类型(F#)。     ,        正如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()
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...