У меня есть недоступный класс с Открытым/Близким синтаксисом, к которому я хотел бы смочь use
, таким образом, я пытаюсь наследоваться ему, и работа Открытое в new
и Завершение в Располагает.
Вторая часть в порядке, но я не могу разработать, как сделать Открытое:
type DisposableOpenCloseClass(openargs) =
inherit OpenCloseClass()
//do this.Open(openargs) <-- compiler no like
interface IDisposable
with member this.Dispose() = this.Close()
(cf. этот вопрос, который я задал давным-давно, но я не могу соединить точки с этим),
Ключ как этот
:
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()
Как предлагает Брайан, вы можете использовать в качестве этого предложения
. Однако в 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"
В некотором смысле это просто личное предпочтение, но Я думаю, что это предпочтительный вариант, потому что он проще, чем использование наследования (хотя у меня нет документа для ссылки здесь :-)).Кроме того, скомпилированный код может быть немного проще, потому что обработка как этого
может потребовать некоторых проверок во время выполнения.