如何处理类别层次结构,其中某些子类是IDisposable而其他类不是?
考虑我有一个基本接口IInterface
。因此,我必须实施IInterface
,ClassA
和ClassB
。如何处理类别层次结构,其中某些子类是IDisposable而其他类不是?
public interface IInterface
{
}
public class ClassA : IInterface
{
}
public class ClassB : IInterface, IDisposable
{
}
注意ClassB
是IDisposable
和ClassA
不是。现在,如果我想创建一个由工厂填充的List<IInterface>
,我该如何处理一次性元素的处理?是否有必要创建一个单独的List<IDisposable>
,然后在构建对象(或构建之后)时过滤列表?我应该只是IInterface
IDisposable
与基础抽象类与默认实现(直到C#7添加默认接口实现)?
我不知道什么是所有的最简单的利用和最清晰的未来阅读。看起来,将潜在的孩子可能被丢弃的所有界面变为IDisposable
是一种潜在的烦人做法。此外,它需要具有空置处理实施的基地,这似乎也不太理想。
你必须检查,如果该实例实现IDisposable
然后调用它。 实施例:
foreach(var item in listOfClasses)
{
var disposableItem = item as IDisposable;
if(disposableItem != null)
disposableItem.Dispose();
....
}
是否需要创建一个单独的列表,然后过滤掉列表中的对象构造(或结构之后)?
是没有必要的。只要像你最初说的那样创建你的清单,并检查一次性物品,如上面所示。
这有帮助吗?
您可以杀死cast/check,只需在该foreach中使用'listOfClasses.OfType
甚至更短(作为IDisposable的项目)?Dispose() –
我得到,我可以遍历列表和按类型过滤或转换它,问题是,如果我必须对基接口的所有接口,为什么不首先使它成为'IDisposable'?这也告诉其他人可能已经制定了他们可能需要处理这些对象的IInterface列表(尽管它们可能不是)。我想问题是,通过查看基本的'IInterface',我不知道有一个孩子需要处理。如果是这种情况,最好的做法是每当它被分组时,最好实践“IDisposable”。 –
是的,使IInterface:IDisposable。我会放弃抽象基类并明确地实现它们。 –
这是C#中的一个扩展性问题,因此没有“理想”的答案。在使用类型特性/特性的语言中,你可以在事实之后“接触”一个接口定义,这使得这些东西变得更清晰。在C#中,我认为使IInterface:IDisposable是最好的中间立场。 –