代码之家  ›  专栏  ›  技术社区  ›  Benjol

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

  •  7
  • Benjol  · 技术社区  · 14 年前

    use ,所以我尝试从中继承,并将Open工作到 new 和关闭进入处置。

    第二部分还可以,但我不知道如何打开:

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

    this question 这是我很久以前问过的,但我不能把这些点连在一起)

    2 回复  |  直到 7 年前
        1
  •  10
  •   Brian    14 年前

    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()
    
        2
  •  4
  •   Tomas Petricek    14 年前

    正如布莱恩所建议的,你可以使用 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"
    

    从某种意义上说,这只是个人偏好,但我认为这是一个首选选项,因为它比使用继承更简单(尽管我没有任何文档可以链接到这里:-))。另外,编译后的代码可能会简单一些,因为 像这样