вызов метода явного интерфейса базового класса В 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# или любого языка; явные интерфейсы не позволяют этого.


вызов явного интерфейса базового класса можно выполнить с помощью отражения.
см. мой ответ на связанный вопрос о C#:
как вызвать явно реализованный интерфейс-метод в базовом классе