隐式声明的释放方法的继承

本文关键字:方法 继承 释放 声明 | 更新日期: 2023-09-27 18:36:19

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

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

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# 中做到这一点?我在上面注释掉的两行都会导致编译错误

隐式声明的释放方法的继承

如果您有权访问这两个类,请更改它们以正确实现一次性模式

如果您无权访问基类,那么要尝试的另一件事是将 Child 类更改为继承基类,而是包含基类的实例作为成员,并在通常调用 base 的位置委托给它。
但是,如果您必须将子类传递给预期基础,则这不起作用,您将无法多态地处理它们。

否则我看不到你的特定泡菜的出路。

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

此外,你要么密封你的类,要么正确地实现IDispose(即不隐式实现IDisposable),不是吗?

进一步更新

应该可以调用Close()而不是像这里所说的那样处理关闭和处置,该叫哪个?

下面是一个ClientBase<T>实现的示例,包括它的 dispose 方法,该方法有条件地调用Close()Abort()

希望这有帮助