Переписано: Поскольку мы говорим о реализации IDisposable, то, что действительно имеет значение, так это то, что классы Derived и Base имеют возможность запускать свой соответствующий код очистки. Этот пример будет охватывать 2/3 сценария; однако, поскольку он является производным от Base () и Base.Dispose () не является виртуальным, вызовы, сделанные для ((Base) Child) .Dispose () не предоставят классу Child возможность очистки.
Единственный обходной путь - не выводить Ребенка из Базы; Однако это было исключено. Вызовы ((IDisposable) Child) .Dispose () и Child.Dispose () позволят и Child, и Base выполнить свой код очистки.
class Base : IDisposable
{
public void Dispose()
{
// Base Dispose() logic
}
}
class Child : Base, IDisposable
{
// public here ensures that Child.Dispose() doesn't resolve to the public Base.Dispose()
public new void Dispose()
{
try
{
// Child Dispose() logic
}
finally
{
// ensure that the Base.Dispose() is called
base.Dispose();
}
}
void IDisposable.Dispose()
{
// Redirect IDisposable.Dispose() to Child.Dispose()
Dispose();
}
}