隐式声明的Dispose方法的继承

时间:2013-10-22 10:31:19

标签: c# inheritance dispose

这已经被问了很多次,但我在互联网上找不到一个提到这个问题的地方。

情况太简单,不能相信它没有解决方案:

public class BaseDispose : IDisposable
{
    void IDisposable.Dispose()
    {

    }
}

public class ChildDispose : BaseDispose, IDisposable
{
    void IDisposable.Dispose()
    {
        //var disp = base as IDisposable;
        //(base as IDisposable).Dispose();
    }
}

有一个具有非托管资源的基类。出于某种原因,它通过IDisposable的隐式实现来处理它们。有一个派生自这个基类的类,它必须摆脱他自己和父母的资源。

如何在c#中完成?我在上面注释掉的两行都会导致编译错误

1 个答案:

答案 0 :(得分:1)

如果您可以访问这两个类,那么请更改它们以正确实现Disposable pattern

如果您无权访问基类,那么另一件要尝试的是将Child类更改为而不是继承基类,但要将其实例包含为成员,并将其委托给您通常会拨打base的地方 但是,如果你要将子类传递给期望基础的东西,那么这将不起作用,你将无法以多态方式处理它们。

否则我看不出你的特定泡菜的方法。

<强>更新
好的,反映了代码并进行了检查System.ServiceModel.ClientBase<TChannel>.Dispose()我可以告诉你它只是调用它的Close()方法,所以让你的处置方法调用base.Close()在功能上是等价的,但显然不太理想

另外,你要么密封你的班级,要么正确实施IDispose(即不隐含地实施IDisposable),不是吗?

进一步更新

应该可以调用Close()而不是按照此处的说明进行处理Close & Dispose, which to call?

以下是ClientBase<T> implementation的一个示例,其中包含了dispose方法,该方法有条件地调用Close()Abort()

希望这有帮助