2017-06-07 5 views
1

私はベースインターフェイスIInterfaceを持っているとします。私は、IInterfaceClassAClassBを実装するクラスにする必要があります。いくつかのサブクラスがIDisposableで他のサブクラスがそうでないクラス階層をどのように処理するのですか?

public interface IInterface 
{ 
} 

public class ClassA : IInterface 
{ 
} 

public class ClassB : IInterface, IDisposable 
{ 
} 

ClassBIDisposableあるとClassAはないことに注意してください。今、工場からいっぱいのList<IInterface>を作成したい場合は、使い捨て要素の廃棄をどのように処理しますか?別のオブジェクトを作成する必要がありますか?オブジェクトが構築されると(または構築後に)リストをフィルタリングしますか?私はちょうどIInterfaceIDisposableデフォルトの実装を持つ基本抽象クラス(C#7がデフォルトのインターフェイス実装を追加するまで)を使うべきですか?

将来的に読むのが最も簡単で使いやすいものは何ですか。潜在的な子供がIDisposableに使い捨て可能なすべてのインターフェースを作成することは、潜在的に面倒な方法です。また、それはまた、理想的ではないように見える空の処分実装を持つ基盤を必要とする。

+0

はい、IInterfaceをIDisposableにします。私は、抽象基本クラスを捨てて、それらをすべて明示的に実装します。 –

+0

これはC#の緊急性の問題です。したがって、「理想的な」答えはありません。 typeclasses/traitsを持つ言語では、事実の後にインタフェース定義を「取り付ける」ことができます。これにより、このようなものがよりクリーンになります。 C#では、IInterface:IDisposableを作成することが最良の中間地であると思います。 –

答えて

1

このインスタンスがIDisposableを実装しているかどうかを確認してから呼び出す必要があります。 例:

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

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

    .... 
    } 

オブジェクトが構築されているとして、それはその後、別のリストを作成し、リストをフィルタリングすることが必要である(または建設後)?

これは必須ではありません。あなたが最初に述べたようにあなたのリストを作成し、上記のような使い捨てアイテムをチェックしてください。

これは役に立ちますか?

+0

キャスト/チェックを終了するには、foreach内で 'listOfClasses.OfType ()'を使用してください。 –

+0

またはさらに短く(IDisposableとしてのアイテム)?Dispose() –

+0

リストを繰り返し処理したり、タイプしたりすることができます。問題は、ベースインターフェイスのすべてのインターフェイスでこれを行う必要がある場合です最初に「IDisposable」にしてみませんか?これはまた、オブジェクトを処理するために必要となるかもしれない 'IInterface'のリストを作成している可能性があることを他の人に伝えます(そうではないかもしれませんが)。私は問題は、ベース 'IInterface'を見るだけで、子どもの一人が処分される必要があることは分かりません。これが当てはまる場合は、そのようにグループ化されるたびに 'IDisposable'をバブルするのがベストプラクティスですか? –

関連する問題