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