隐式声明的释放方法的继承
本文关键字:方法 继承 释放 声明 | 更新日期: 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()
希望这有帮助