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

时间:2016-10-25 10:42:20

标签: c# idisposable

我有一个具有以下定义的类,我希望它覆盖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会要求我的类具有Dispose()覆盖。但事实并非如此,我不知道我需要做些什么才能做到这一点。

我需要做些什么才能妥善处理班级实例?

3 个答案:

答案 0 :(得分:2)

如果你的类真的在问题中实现了这些接口,你应该得到编译错误

  

MyClass未实现接口成员IDisposable.Dispose()

enter image description here

在您添加public void Dispose()实施

的那一刻,这将解决

<强>更新

  

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

从基类覆盖overrideabstract方法时,使用

virtual关键字。在实现接口时,不需要关键字。由override keyword上的MSDN声明:

  

需要使用override修饰符来扩展或修改继承的方法,属性,索引器或事件的抽象或虚拟实现。

如果不是接口而是扩展基类,而Dispose方法会有abstractvirtual个关键字,您可以override在派生类中实现它

object的{​​{1}}为例:

ToString()

如果在你班上你会添加一个函数:

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();
    }    
}

答案 1 :(得分:1)

  

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

更改基类

int assign(int a[NROW][NCOL], int starting_no)
{
    int x, y, old_starting_no;

    old_starting_no = starting_no;

    for (x = 0; x<NROW; x++)
    {
        starting_no = old_starting_no;

        for (y = 0; y<NCOL; y++)
        {
            a[x][y] = starting_no;
            starting_no += x;
        }
    }

    return a[NROW-1][NCOL-1];
}

您的新类型

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

您的新类型

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

答案 2 :(得分:0)

  

我认为实现IDisposable会要求我的类具有Dispose()覆盖。但事实并非如此,我不知道我需要做些什么才能做到这一点。

没有。接口不使用abstract/virtual/override个关键字。作者已经实现了接口,而不是覆盖任何虚拟方法。

注意IDisposable定义中没有virtual/abstract

public interface IDisposable
{
    void Dispose();
}
  

为什么不是覆盖?

作者本可以选择遵循最佳做法并提供protected virtual void Dispose(bool disposing),但也不要选择 我猜他不会指望你想延长课程。

你现在能做什么?

如果您有权更改代码,那么您可以继续执行IDisposable。例如。 https://msdn.microsoft.com/en-us/library/ms244737.aspx

如果您无法更改代码,那么您仍然可以选择。您可以使用composition / decorator模式来提供自己的Dispose实现。

您可以从MyClient继承,然后为Dispose自己明确提供实现。当物体被丢弃时,它将是被称为接口的方法 这有效地与压倒一样。 E.g:

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