Вам, вероятно, лучше поместить свою логику очистки в виртуальный метод и реализовать IDisposable
только один раз.
type A() =
abstract Close : unit -> unit
default __.Close() =
printfn "Cleaning up A"
interface System.IDisposable with
member this.Dispose() = this.Close()
type B() =
inherit A()
override __.Close() =
printfn "Cleaning up B"
base.Close()
Поскольку модификатора доступа protected
нет, вы можете использовать файл подписи, чтобы сделать Close
закрытым (или пометить его internal
).
Ключевое слово base
может использоваться только для доступа пользователя, но не отдельно. Вот почему base :> IDisposable
не работает.
Глядя в Reflector, Dispose
вызывает только открытый метод Close
. Таким образом, вы можете повторно внедрить IDisposable
и вместо этого вызвать base.Close()
.
Вы могли бы иметь такой же сценарий в C #. Наследуемые классы, которые реализуют IDisposable
, должны обеспечивать возможность для подклассов «подключаться» к утилизации. Обычно это делается путем предоставления перегрузки protected virtual Dispose(disposing)
, которая вызывается из Dispose()
. По какой-то причине DuplexClientBase
не следует этому соглашению. Возможно, это было сочтено ненужным, учитывая, что Dispose
просто переходит к Close
.