我有一个非一次性的开放/关闭语法类,我希望能够use
,所以我试图继承它,并将Open打开到{{1}和关闭处理。
第二部分没问题,但我无法弄清楚如何进行开放:
new
(参考我很久以前问过的this question,但我不能加入这一点)
答案 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
可能需要一些运行时检查。