Вы должны следовать обычному шаблону для реализации Dispose
. Создание Dispose()
виртуальным считается плохой практикой, потому что традиционный шаблон подчеркивает повторное использование кода в «управляемой очистке» (клиент API, вызывающий Dispose()
напрямую или через using
) и «неуправляемая очистка» (GC-финализатор вызовов). Напомним, что картина такова:
public class Base
{
~Base()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // so that Dispose(false) isn't called later
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose all owned managed objects
}
// Release unmanaged resources
}
}
Ключ здесь в том, что нет никакого дублирования между финализации и Dispose
для неуправляемого очистки, и тем не менее любой производный класс может расширить управляемых и неуправляемых очистки.
В вашем случае, то, что вы должны сделать это:
protected abstract void Dispose(bool disposing)
и оставить все остальное, как есть. Даже это имеет сомнительную ценность, поскольку вы применяете свои производные классы для реализации Dispose
сейчас - и откуда вы знаете, что все они нуждаются в нем? Если вашему базовому классу нечего распоряжаться, но большинство производных классов, вероятно, делают (возможно, за некоторыми исключениями), а затем просто предоставляют пустую реализацию. Это то, что делает System.IO.Stream
(сам абстрактный), поэтому есть прецедент.
Зачем вам нужно добавить Dispose() в свой интерфейс? Если он унаследован от IDisposable, метод Dispose() уже является частью вашего интерфейса. –
Сет, вам нужно реализовать все интерфейсные элементы. Оставлять его не собиралось. –