2010-06-10 13 views
7

ben use edebilmek istiyorum Açma/Kapama sözdizimi olmayan bir tek kullanımlık sınıf var, bu yüzden ondan devralan çalışıyorum ve içine Aç çalışmak ediyorum artırmada new ve Tasfiye Etme.F # yapıcı sözdizimi - overiding ve yeni

ikinci bölümü Tamam, ama Aç nasıl yapılacağını çalışamaz: Ben uzun zaman önce sorulan

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

(Bkz this question ama noktalar katılamaz bu bir)

cevap

10

Anahtar as this olduğu için:

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

Brian anlaşılacağı gibi, as this maddesini kullanabilirsiniz. Ancak, F # 'da, genellikle bunun için gerçekten iyi bir neden olduğunda (örneğin, bazı sanal sınıfları uygulamanız ve bir .NET kitaplığına geçirmeniz gerektiğinde) alt sınıflama (miras) kullanmak önerilir.

senin örneğini hayata geçiren, muhtemelen işlev basit nesne ifadesini kullanılarak IDisposable dönen tercih ediyorum: Bu sadece kişisel bir tercih olduğunu bir noktada için

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" 

, ama bunun olduğunu düşünüyorum tercih edilen seçenek, çünkü miras kullanmaktan daha basittir (burada, buraya bağlanmak için herhangi bir belgem olmamasına rağmen). Ayrıca, derlenmiş kod biraz daha basit olabilir, çünkü as this'un kullanılması bazı çalışma zamanı denetimleri gerektirebilir.

+0

Sayenizde özel durumda, ben 'taban' sınıfına diğer fonksiyonlarına erişim ihtiyacı vardı, sadece arayüz dönen yeterli olmayacaktır. – Benjol