Синтаксис конструктора F # - переопределение и добавление новых - PullRequest
7 голосов
/ 10 июня 2010

У меня есть одноразовый класс с синтаксисом Open / Close, который я хотел бы иметь в состоянии use, поэтому я пытаюсь унаследовать его и перевести Open в new и Closeв Dispose.

Вторая часть в порядке, но я не могу понять, как сделать Open:

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

(ср. этот вопрос , который яспросил давно, но я не могу присоединить точки к этому)

Ответы [ 2 ]

10 голосов
/ 10 июня 2010

Ключ 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 голосов
/ 10 июня 2010

Как предлагает Брайан, вы можете использовать предложение 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 может потребовать некоторых проверок во время выполнения.

...