вызов метода явного интерфейса базового класса В F#
Ok Я получаю тип B
из базового класса A
.
A
осуществляет IDisposable
явный, но я должен сделать дополнительную очистку в B
, Так что я реализую IDisposable
на B
:
interface IDisposable with
member i.Dispose() =
// ... additional work
base.Dispose() // <- want to do but cannot
вопрос: Как получить доступ к Dispose-методу из базы?
(base :> IDisposable).Dispose()
дает ошибку компилятора: Unexpected symbol ':>' in expression. Expected '.' or other token.
делать что-то вроде
(i :> IDisposable).Dispose()
конечно дает StackOverflowException
на время работы - так как я могу это сделать? Прости, но никогда. сталкивался с чем-то подобным раньше...
3 ответов
вам, вероятно, лучше поместить свою логику очистки в виртуальный метод и реализовать 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
не работает.
глядя в рефлектор, Dispose
только призывает общественность Close
метод. Так вы может повторно реализовать IDisposable
и звонок base.Close()
вместо.
у вас может быть такой же сценарий в C#. Наследуемые классы, реализующие IDisposable
должен обеспечить способ для подклассов "подключить" к утилизации. Обычно это делается путем предоставления protected virtual Dispose(disposing)
перегрузка, которая вызывается из Dispose()
. По какой причине DuplexClientBase
не следует этой конвенции. Возможно, это было сочтено ненужным, учитывая, что Dispose
только вперед к Close
.
вызов явного интерфейса базового класса можно выполнить с помощью отражения.
см. мой ответ на связанный вопрос о C#:
как вызвать явно реализованный интерфейс-метод в базовом классе