Синтаксис конструктора F# - переопределение и новое увеличение

У меня есть недоступный класс с Открытым/Близким синтаксисом, к которому я хотел бы смочь use, таким образом, я пытаюсь наследоваться ему, и работа Открытое в new и Завершение в Располагает.

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

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

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

7
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

Ключ как этот:

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()
10
ответ дан 6 December 2019 в 15:19
поделиться

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

В некотором смысле это просто личное предпочтение, но Я думаю, что это предпочтительный вариант, потому что он проще, чем использование наследования (хотя у меня нет документа для ссылки здесь :-)).Кроме того, скомпилированный код может быть немного проще, потому что обработка как этого может потребовать некоторых проверок во время выполнения.

4
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: