【问题标题】:Correct way to dispose a base class? [duplicate]处理基类的正确方法? [复制]
【发布时间】:2018-01-05 20:09:01
【问题描述】:

我知道这个问题以前可能已经回答过,但我一辈子都找不到这个答案已经给出的问题。

我有 2 个类,我在其中 1 个上调用 dispose,我只是想知道我是否必须在 A 的 dispose 内显式调用 B 类的 dispose?还是会因为它已经是 A 的基类而自动执行此操作?

我如此关心的原因是 Resharper(A 与扩展)不断地给我一条指向它的消息。

'A.Dispose()' 隐藏继承的成员'B.Dispose()',如果想要隐藏,请使用 new 关键字。 “Dispose”需要关键字“new”,因为它隐藏了方法“void App.B.Dispose()”

class A : B, IDisposable
{
    public void Dispose() {
    }
}

class B : IDisposable
{
    public void Dispose() {
    }
}

【问题讨论】:

  • 如果 A 继承自 B,为什么将 A 标记为 IDisposable? A 已经一次性
  • 那么当你实际运行代码并调用 dispose 时,到底发生了什么?运行了哪些方法?
  • @maccettura 它改变了该类型对象的接口方法的绑定。
  • 我猜你没有很好地理解 OO 概念......当你有一个实现 IDisposable 的类 B 并创建一个继承自 B 的类 A 时,然后A 自动“拥有”B 提供的一切(包括IDisposable 的实现)。您不需要在 A 上重新实现 Dispose 方法
  • @DiegoRafaelSouza 您只是假设不需要处理任何特定于 A 的内容。这很可能不是真的。

标签: c# .net


【解决方案1】:

您可以在基类中将 IDisposable 实现为 virtual,但这违反了 Liskov 替换原则。如果您需要派生类自行处理,您应该执行以下操作:

internal abstract class B : IDisposable
{
    public void Dispose()
    {
        DisposeImpl();
    }

    protected abstract void DisposeImpl();
}

internal sealed class A : B
{
    protected override void DisposeImpl()
    {
        //TODO.
    }
}

【讨论】:

  • 为什么 B 在你的答案中继承自 A?
  • 因为我读了一遍问题,然后写了答案。我错过了 OP 被反转了。
  • 你不应该回答明显重复的问题。
  • 这不是一个明显的重复 - 我认为链接的问题是使用“官方”处置模式,除非您处置非托管资源,否则该模式的实用性非常有限。此外,链接问题的公认答案是 Liskov 违规。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2012-04-19
  • 2018-02-19
  • 2019-03-04
  • 1970-01-01
  • 2010-12-08
相关资源
最近更新 更多