F#构造函数语法 - 覆盖和扩充新的

时间:2010-06-10 06:13:01

标签: syntax f# constructor

我有一个非一次性的开放/关闭语法类,我希望能够use,所以我试图继承它,并将Open打开到{{1}和关闭处理。

第二部分没问题,但我无法弄清楚如何进行开放:

new

(参考我很久以前问过的this question,但我不能加入这一点)

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

正如Brian建议的那样,您可以使用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可能需要一些运行时检查。