【问题标题】:How do I handle class hierarchies where some subclasses are IDisposable and others are not? [duplicate]我如何处理一些子类是 IDisposable 而其他子类不是的类层次结构? [复制]
【发布时间】:2017-06-07 09:06:19
【问题描述】:

假设我有一个基本接口IInterface。我必须要实现IInterfaceClassAClassB 的类。

public interface IInterface
{
}

public class ClassA : IInterface
{
}

public class ClassB : IInterface, IDisposable
{
}

注意ClassBIDisposableClassA 不是。现在,如果我想创建一个从工厂填充的List<IInterface>,我该如何处理一次性元素?是否有必要创建一个单独的List<IDisposable>,然后在构造对象时(或构造之后)过滤掉列表?我应该只使用 IInterface IDisposable 和带有默认实现的基本抽象类(直到 C#7 添加默认接口实现)?

我不确定将来最容易使用和最清晰阅读的内容是什么。似乎将所有潜在孩子可能被丢弃的界面都变成IDisposable 是一种潜在的恼人做法。此外,它还需要具有空 dispose 实现的基础,这似乎也不理想。

【问题讨论】:

  • 是的,使 IInterface:IDisposable。我会放弃抽象基类并明确地实现它们。
  • 这是 C# 中的一个 experessivity 问题,因此没有“理想”的答案。在具有类型类/特征的语言中,您可以在事后“附加”接口定义,这使得像这样的东西更干净。在 C# 中,我认为制作 IInterface:IDisposable 是最好的中间立场。

标签: c# idisposable


【解决方案1】:

您必须检查该实例是否实现IDisposable 然后调用它。 示例:

    foreach(var item in listOfClasses)
    {
       var disposableItem = item as IDisposable;

       if(disposableItem != null)
          disposableItem.Dispose();

     ....
    }

是否有必要创建一个单独的列表,然后在构造对象时(或构造后)过滤掉列表?

这不是必须的。只需按照您最初的说明创建您的清单,然后检查我上面显示的一次性物品。

这有帮助吗?

【讨论】:

  • 你可以杀死演员/检查,只需在 foreach 中使用listOfClasses.OfType<IDisposable>()
  • 甚至更短(item as IDisposable)?.Dispose()
  • 我知道我可以遍历列表并按类型过滤或强制转换,问题是如果我必须对基本接口的所有接口执行此操作,为什么不直接使用 @987654324 @首先?这也告诉其他可能已经列出IInterface 的人他们可能需要处理这些对象(尽管他们可能不需要)。我想问题是,仅通过查看基础IInterface,我无法知道其中一个孩子需要被处置。如果是这种情况,最好的做法是在像这样分组时冒泡IDisposable
  • 首先,我认为实现IDisposable 并不是一个好习惯,因为它不需要仅仅为了便于编程。相反,您可以通过在 foreach 块之外调用 listOfBaseInterface.OfType<IDisposable>() 来获取实现 IDisposable 的集合,以获取单独实现此功能的所有类型,然后您就可以进行必要的操作。似乎是一种更清洁的方式。
猜你喜欢
  • 2015-03-14
  • 2011-10-17
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多