为什么 class 实现 IDispose 没有 OnDisposed 覆盖?

Why does class implementing IDispose not have OnDisposed override?

我有一个具有以下定义的 class,我希望它具有 Dispose 方法的覆盖:

编辑

事实证明有一个 Dispose() 方法,但它不是覆盖。我期待一个覆盖。这可能是一个无效的问题....但为什么不是覆盖?

public class MyClient : IMyClient2
{
    public void Dispose()
    {
        Dispose(true);
    }

    private void Dispose(bool disposing)
    {
        if(disposing)
        {
            Stop();
        }
    }
}

它扩展的接口,以及它的后续接口,定义为:

public interface IMyClient2 : IMyClient
{
    // one or two methods
}

public interface IMyClient : IDisposable
{
    // a bunch of methods
}

我认为实现 IDisposable 需要我的 class 覆盖 Dispose()。但它并没有,我不知道我需要做什么才能做到这一点。

我需要做什么才能正确处理我的 class 实例?

如果您的 class 确实像问题中那样实现了这些接口,您应该得到

的编译错误

MyClass does not implement interface member IDisposable.Dispose()

添加 public void Dispose() 实现后即会解决


更新:

it turns out there is a Dispose() method, but it's not an override. I was expecting an override. This may be an invalid question.... but why isn't it an override?

override 关键字用于从基础 class 覆盖 abstractvirtual 方法。当您实现接口时,不需要关键字。 MSDN 在 override keyword:

上声明

The override modifier is required to extend or modify the abstract or virtual implementation of an inherited method, property, indexer, or event.

如果您扩展基 class 而不是接口,并且 Dispose 方法将具有 abstractvirtual 关键字,您可以 override它在派生的 class.

中实现

objectToString()为例:

public class Object
{       
    // Returns a String which represents the object instance.  The default
    // for an object is to return the fully qualified name of the class.
    // 
    public virtual String ToString()
    {
        return GetType().ToString();
    }    
}

如果在您的 class 中,您将添加一个功能:

public override string ToString()
{
    // Add your implementation
}

I thought that implementing IDisposable would require that my class have the Dispose() override. But it doesn't and I don't know what I need to do to make it so that it does.

更改基数class

public class MyClient : IMyClient2
{
    public virtual void Dispose()
    {
        Dispose(true);
    }
}

你的新类型

public class MyClient2 : MyClient
{
    public override void Dispose()
    {
        // add your dispose information
        base.Dispose(true);
    }
}

这将允许派生自您的 MyClient 类型的类型也实现它们自己对 Dispose 方法的覆盖。不需要在覆盖类型中实现 Dispose。如果需要,则必须使用抽象 Dispose 方法将 MyClient class 标记为抽象。

更改基数class

public abstract class MyClient : IMyClient2
{
    public abstract void Dispose()
    {
        Dispose(true);
    }
}

你的新类型

public class MyClient2 : MyClient
{
    public override void Dispose()
    {
        // add your dispose information
        base.Dispose(true);
    }
}

I thought that implementing IDisposable would require that my class have the Dispose() override. But it doesn't and I don't know what I need to do to make it so that it does.

没有。接口不使用 abstract/virtual/override 关键字。作者实现了接口,没有重写任何虚方法

注意 IDisposable 定义中没有 virtual/abstract:

public interface IDisposable
{
    void Dispose();
}

why isn't it an override?

作者本可以选择遵循最佳实践并提供 protected virtual void Dispose(bool disposing) 但他没有选择。
我猜他没想到你会想要延长 class.

你现在可以做什么?

如果您有权更改代码,那么您可以继续并根据需要实施 IDisposable。例如。 https://msdn.microsoft.com/en-us/library/ms244737.aspx

如果您不能更改代码,那么您还有其他选择。您可以使用 composition/decorator 模式来提供您自己的 Dispose 实现。

您可以继承自 MyClient,然后自己明确提供 Dispose 的实现。释放对象时,将调用与接口关联的方法。
这实际上与覆盖相同。例如:

public class MyClient2 : MyClient
{
    void IDisposable.Dispose()
    {
        base.Dispose();
        //Do whatever you like here.
    }
}