Реализация IDisposable на подклассе, когда родитель также реализует IDisposable

У меня есть родительский и дочерний класс, которые оба должны реализоватьIDisposable, Где долженvirtual (а такжеbase.Dispose()?) звонки вступают в игру? Когда я просто переопределитьDispose(bool disposing) звонить, это очень странно, заявив, что я реализуюIDisposable без явногоDispose() функция (просто используя унаследованную), но имея все остальное.

Что я делал (тривиализировал совсем немного):

internal class FooBase : IDisposable
{
    Socket baseSocket;

    private void SendNormalShutdown() { }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private bool _disposed = false;
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                SendNormalShutdown();
            }
            baseSocket.Close();
        }
    }

    ~FooBase()
    {
        Dispose(false);
    }
}

internal class Foo : FooBase, IDisposable
{
    Socket extraSocket;

    private bool _disposed = false;
    protected override void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            extraSocket.Close();
        }
        base.Dispose(disposing);
    }

    ~Foo()
    {
        Dispose(false);
    }

}

Ответы на вопрос(5)

Ваш ответ на вопрос