2017-06-07 34 views
1

考慮我有一個基本接口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是最好的中間立場。 –

回答

1

你必須檢查,如果該實例實現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」。 –

相關問題