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

Syntax F#构造函数语法-覆盖和扩充新,syntax,f#,constructor,Syntax,F#,Constructor,我有一个具有打开/关闭语法的非一次性类,我希望能够使用它,因此我尝试从它继承,并将打开操作转换为新的和关闭操作 第二部分还可以,但我不知道如何打开: type DisposableOpenCloseClass(openargs) = inherit OpenCloseClass() //do this.Open(openargs) <-- compiler no like interface IDisposable with member this

我有一个具有打开/关闭语法的非一次性类,我希望能够
使用它,因此我尝试从它继承,并将打开操作转换为
新的
和关闭操作

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

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

//执行此操作。打开(openargs)键为
,如下所示:

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

正如Brian所建议的,您可以使用
作为这个
子句。然而,在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"