2009-04-21 29 views
21

2つのインターフェイスを実装する必要があるパラメータを取り込む関数を定義することはできますか?パラメータを2つのインターフェイスに実装することは可能ですか?

(2つのインタフェースは、私はちょうど私の頭の上をオフに覚えていたものであり、ものは私が使用したくない)

private void DoSomthing(IComparable, ICollection input) 
{ 

} 
+0

このアプローチではパターンをオプトインするためにクラスを実装する必要がありますが、[メンバ変数の宣言と同じトリック](http://stackoverflow.com/a/4940249/429091)を使用することができます。 – binki

答えて

49

あなたがすることができます

1)の両方に必要なインタフェースを継承するインタフェース定義:

public interface ICombinedInterface : IComparable, ICollection {... } 

private void DoSomething(ICombinedInterface input) {... } 

2)ジェネリックを使用します。

private void DoSomething<T>(T input) 
    where T : IComparable, ICollection 
{...} 
+3

:Private Sub DoSomthing(Of T As {IComparable、ICollection })(ByVal input As T)...End Sub – Pondidum

+0

2つの別々のパラメータを持つ以上、これらのソリューションの1つを使用して利得がありますか?直感的には、役に立つと思われますが、私は具体的な例を考えるのに苦労しています。 – CurtainDog

+0

私は現時点では考えられませんが、私は数日前にこれをやりたかったのです。 DoSomthing(testData、testData)を呼び出して同じインスタンスを2回渡すよりも、1つのパラメータを持つ方がよく見えます。 – Pondidum

5

あなたはこれら二つのインタフェースから別のインタフェースを継承し、あなたのパラメータはそれを実装することができますインタフェース。

+1

は、新しいインターフェイスを実装するために両方のインターフェイスを実装するすべてのクラスを変更できる場合にのみ機能します。 –

+0

まあ、それらのすべてが必ずしもそうではありません。そのメソッドのパラメータとして使用する必要があるものだけです。 VB.Netの –

2

まあ、はい、およびnoです。

Steveが示唆しているように、必要な2つのインターフェイスから別の3番目のインターフェイスを作成し、それをパラメータタイプとして使用できます。

しかし、これにより、使用されているクラスがその第3のインタフェースも実装する必要があります。言い換えれば

、これは動作しません。

public interface I1 { } 
public interface I2 { } 
public class C : I1, I2 { } 

public interface I3 : I1, I2 { } 
public class YourClass 
{ 
    public void Test(I3 i) { } 
} 

... 
YourClass yc = new YourClass(); 
C c = new C(); 
yc.Test(c); // won't work, C does not implement I3 

しかし、あなたはジェネリックの方法であなたが望むものにコンパイラをだますことができます。

public class YourClass 
{ 
    public void Test<T>(T i) where T: I1, I2 { } 
} 

これで動作します。私はまだ100%あなたが他の問題を与えることはありませんが、私はそれについて考えなければならないと確信していません。

1

上記のジェネリック関数のアプローチは、1つの大きな注意点があります:オブジェクトを複数のジェネリック制約を持つルーチンに渡すことができるように型キャストするには、それらの制約を満たす型を知っていなければなりません。キャストされるオブジェクトの親タイプです。そのようなオブジェクトを受け入れるルーチンは、そのような型(generic型のパラメータとして渡されました)を知っていますが、クラスがそのような情報を保持して後で使用する良い方法はありません。関係のないさまざまな型がIFooとIBarの両方を実装している場合、無関係なオブジェクトインスタンスを多数受け入れてリストや何かに格納し、リスト内のすべての項目をルーチンに渡すことは困難です一般的なIFoo + IBarパラメータを使用します。

このようなシナリオが必要な場合は、各ジェネリックルーチンに対応する非ジェネリックな対応が必要です。 IFoo型のパラメータを取得し、必要に応じてIBarにキャストします。リスト<IFoo>にすべての項目を格納してルーチンに渡すことができます。 1つはジェネリックメソッドの型安全性を失うことになりますが、完全な型安全性は達成できないことがあります。

関連する問題