2010-06-10 4 views
7

나는 Open/Close 구문을 사용하여 use이 가능하도록하고 싶습니다. 따라서이 클래스에서 상속을 받고 Open으로 작업하려고합니다. new 및 폐기 처분으로 닫습니다.F # 생성자 구문 - 초과 및 확장 새로운

두 번째 부분은 괜찮습니다,하지만 난 오픈 할 방법을 작동하지 않을 수 있습니다 : 나는 오래 전에 요청

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

(참조 this question,하지만 난 점에 참가할 수 없습니다 이 일)

답변

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

브라이언 알 수 있듯이, 당신은 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을 처리 할 때 일부 런타임 검사가 필요할 수 있으므로 컴파일 된 코드가 조금 더 간단 할 수 있습니다.

+0

감사합니다. 특별한 경우에 '기본'클래스의 다른 함수에 액세스해야하므로 인터페이스를 반환하는 것만으로는 충분하지 않습니다. – Benjol