2012-08-04 34 views
3

下面的代碼產生「T1 T1 T2」繼承的成員。我想知道是否有人可以請告訴我如何改變它以獲得「t1 t2 t2」。在t2中使用「覆蓋」而不是「成員」是錯誤的,我不明白爲什麼。我很高興看到RTFM,只要我能知道FM的外觀和用途。重寫在F#

提前千恩萬謝的,對不起,如果我錯過了,爲什麼我想應該是不可能的哪些根本原因。

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() 

回答

5

這應該有你想要的行爲:

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() 
+0

非常感謝答案。我想知道是否可以指出我爲什麼似乎有兩個相當容易混淆的名稱空間的解釋,即爲什麼有兩個容易混淆的doit()版本有用?非常感謝。 – 2012-08-05 08:56:48

+3

@justme:在F#中,接口總是明確地實現的,所以一個是接口實現,另一種是剛上型公共成員函數,從界面完全不同。在這種情況下,在'T2'前者在後者的術語(以避免必須澆鑄或複製代碼)來實現。 – ildjarn 2012-08-05 09:16:46