F#的构造函数语法 - overiding和augmenting新的

问题描述:

我有一个非一次性的类,打开/关闭语法,我想能够use,所以我试图从它继承,并将Open打入new和关闭处置。F#的构造函数语法 - overiding和augmenting新的

第二部分是确定的,但我不能工作,如何做好开放:

type DisposableOpenCloseClass(openargs) = 
    inherit OpenCloseClass() 
    //do this.Open(openargs) <-- compiler no like 
    interface IDisposable 
     with member this.Dispose() = this.Close() 

(参见this question我问了很久以前,但我不能加入点这一个)

主要是as this

type OpenCloseClass() = 
    member this.Open(x) = printfn "opened %d" x 
    member this.Close() = printfn "closed" 

open System 

type DisposableOpenCloseClass(openargs) as this = 
    inherit OpenCloseClass() 
    do this.Open(openargs) 
    interface IDisposable 
     with member this.Dispose() = this.Close() 

let f() = 
    use docc = new DisposableOpenCloseClass(42) 
    printfn "inside" 

f() 

布赖恩建议,您可以使用as this条款。但是,在F#中,只有在确实有充分的理由时(例如,您需要实现一些虚拟类并将其传递给.NET库),通常才推荐使用子类化(继承)。

如果我实现你的榜样,我可能会更喜欢功能使用简单对象表达返回IDisposable

let disposableOpenClose(openargs) = 
    let oc = new OpenCloseClass() 
    oc.Open(openargs) 
    { new IDisposable with 
     member this.Dispose() = oc.Close() } 

let f() = 
    use docc = disposableOpenClose(42) 
    printfn "inside" 

为了某些时候,这仅仅是个人喜好,但我认为这是一个因为它比使用继承简单(尽管我没有任何文档可以链接到这里:-))。此外,编译的代码可能会更简单一些,因为处理as this可能需要一些运行时检查。

+0

谢谢,在我的特殊情况下,我需要访问'base'类中的其他函数,所以仅仅返回接口是不够的。 – Benjol 2010-06-11 05:31:33