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
可能需要一些运行时检查。
谢谢,在我的特殊情况下,我需要访问'base'类中的其他函数,所以仅仅返回接口是不够的。 – Benjol 2010-06-11 05:31:33