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中的继承成员#_F# - Fatal编程技术网

F# 重写F中的继承成员#

F# 重写F中的继承成员#,f#,F#,下面的代码生成“t1 t2”。我想知道是否有人可以告诉我如何改变它,以便得到“t1 t2”。在t2中使用“override”而不是“member”是一个错误,我不明白为什么。我非常乐意使用RTFM,只要我知道在哪里以及在什么FM中查找 非常感谢,如果我错过了一些我想要的东西不可能实现的基本原因,我会感到抱歉 type myinterface = abstract member doit : unit -> unit type t1 () = interface myinter

下面的代码生成“t1 t2”。我想知道是否有人可以告诉我如何改变它,以便得到“t1 t2”。在t2中使用“override”而不是“member”是一个错误,我不明白为什么。我非常乐意使用RTFM,只要我知道在哪里以及在什么FM中查找

非常感谢,如果我错过了一些我想要的东西不可能实现的基本原因,我会感到抱歉

type myinterface =
   abstract member doit : unit -> unit

type t1 () =
   interface myinterface with
      member x.doit () = printf "t1\n"

type t2 () =
    inherit t1 ()

    member x.doit () = printf "t2\n"

let override_test () =
    let t1 = t1 () :> myinterface
    let t2 = t2 ()
    let t2i = t2 :> myinterface
    t1.doit ()
    t2i.doit ()
    t2.doit ()

这应该具有您想要的行为:

type myinterface =
    abstract member doit : unit -> unit

type T1 () =
    interface myinterface with
        member x.doit () = printfn "t1"

type T2 () =
    inherit T1 ()
    member x.doit () = printfn "t2"
    interface myinterface with
        member x.doit () = x.doit ()

let override_test () =
    let t1i = T1() :> myinterface
    let t2 = T2()
    let t2i = t2 :> myinterface
    t1i.doit ()
    t2i.doit ()
    t2.doit ()

非常感谢你的回答。我想知道您是否可以给我一个解释,解释为什么有两个很容易混淆的名称空间,即为什么有两个容易混淆的doit()版本很有用?非常感谢。@justme:在F#中,接口总是显式实现的,因此一个是接口实现,另一个只是类型上的公共成员函数,与接口完全不同。在这种情况下,在
T2
中,前者根据后者来实现(以避免强制转换或复制代码)。