如何处理类别层次结构,其中某些子类是IDisposable而其他类不是?

问题描述:

考虑我有一个基本接口IInterface。因此,我必须实施IInterface,ClassAClassB如何处理类别层次结构,其中某些子类是IDisposable而其他类不是?

public interface IInterface 
{ 
} 

public class ClassA : IInterface 
{ 
} 

public class ClassB : IInterface, IDisposable 
{ 
} 

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

我不知道什么是所有的最简单的利用和最清晰的未来阅读。看起来,将潜在的孩子可能被丢弃的所有界面变为IDisposable是一种潜在的烦人做法。此外,它需要具有空置处理实施的基地,这似乎也不太理想。

+0

是的,使IInterface:IDisposable。我会放弃抽象基类并明确地实现它们。 –

+0

这是C#中的一个扩展性问题,因此没有“理想”的答案。在使用类型特性/特性的语言中,你可以在事实之后“接触”一个接口定义,这使得这些东西变得更清晰。在C#中,我认为使IInterface:IDisposable是最好的中间立场。 –

你必须检查,如果该实例实现IDisposable然后调用它。 实施例:

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

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

    .... 
    } 

是否需要创建一个单独的列表,然后过滤掉列表中的对象构造(或结构之后)?

是没有必要的。只要像你最初说的那样创建你的清单,并检查一次性物品,如上面所示。

这有帮助吗?

+0

您可以杀死cast/check,只需在该foreach中使用'listOfClasses.OfType ()'。 –

+0

甚至更​​短(作为IDisposable的项目)?Dispose() –

+0

我得到,我可以遍历列表和按类型过滤或转换它,问题是,如果我必须对基接口的所有接口,为什么不首先使它成为'IDisposable'?这也告诉其他人可能已经制定了他们可能需要处理这些对象的IInterface列表(尽管它们可能不是)。我想问题是,通过查看基本的'IInterface',我不知道有一个孩子需要处理。如果是这种情况,最好的做法是每当它被分组时,最好实践“IDisposable”。 –