2009-08-11 7 views
2

私は何をしたいのかよく分かりませんが、とにかく問題があります。私はMyClassという汎用のIEnumerableクラスの2つの異なるタイプを実装したいのですが、例えば今C#は2つの異なるジェネリックインターフェイスを実装しています

public class MyClass : IEnumerable<KeyValuePair<string, string>>, 
         IEnumerable<KeyValuePair<MyEnum, string>> 

私はインターフェイスから、必要なメソッドを定義しようとすると、これを行うことに伴う問題は、コンパイラは文句れる「タイプ 『をMyClassの』は既に同じパラメータ型で 『GetEnumeratorメソッド』と呼ばれるメンバーを定義します」。

public IEnumerator<KeyValuePair<MyEnum, string>> GetEnumerator() { ... } 
public IEnumerator<KeyValuePair<string, string>> GetEnumerator() { ... } 

私が原因インタフェースのパラメータなしのGetEnumerator()を持っている必要があり、そして異なっ唯一のことが許可されていない戻り値の型、である:私はこれらの2つの方法を持っているためです。ここで

は、私は私のオプションとして見るものです:

  1. 私はMyClassを実装し、「メイン」IEnumerableジェネリック型を有する考慮して、ただのパラメータだけではなく、戻り値の型によって異なり、余分なメソッドを追加しました(例えば、Add)、余分なジェネリックインタフェースを実装する必要はありません。
  2. MyClassの汎用ベースクラスを作成し、それをMyBaseClass<T>と呼び、IEnumerable<KeyValuePair<T, string>>を実装します。次に、私はMyClassの異なるバージョンを持っています。 MyClass<string>およびMyClass<MyEnum>

ここでは好ましいと思われるものがありますか、それとももっと良い解決策になるものがないのでしょうか?

+0

インターフェイス(またはそれ以上)を継承することはできません。 –

+0

@Arnis:どういう意味ですか? – scwagner

+0

http://msdn.microsoft.com/en-us/library/ms973861.aspx –

答えて

14

実装している2つのインターフェイスのそれぞれに異なる実装を得るために、明示的なインターフェイス宣言を使用できます。たとえば:

public class MyClass : IEnumerable<KeyValuePair<string, string>>, 
        IEnumerable<KeyValuePair<MyEnum, string>> 
{ 
    IEnumerator<KeyValuePair<MyEnum, string>> IEnumerable<KeyValuePair<MyEnum, string>>.GetEnumerator() 
    { 
     // return your enumerator here 
    } 

    IEnumerator<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator() 
    { 
     // return your enumerator here 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     var me = this as IEnumerable<KeyValuePair<string, string>>; 
     return me.GetEnumerator(); 
    } 
} 

しかし、IEnumerableをから派生> IEnumerableを<ので、あなたがIEnumerable.GetEnumerator()呼び出しから復帰したい1選択する必要があります。

2

あなたが明示的にこのような各インターフェイスを実装することができます

IEnumerable<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator() { ... } 
IEnumerator<KeyValuePair<MyEnum, string>> IEnumerator<KeyValuePair<MyEnum, string>>.GetEnumerator() { ... } 
2

あなたは矛盾する方法とのインタフェースを実装するためにexplicit interface implementationを使用することができます。しかし、2つのIEnumerable<T>インターフェイスを実装すると、foreachループのようないくつかの面倒な問題が発生します。私はかつてこれを何かのために試してすぐに、1 IEnumerableインタフェースの実装に戻り、オブジェクトのプロパティとしてもう1つを提供しました。

+1

2分で明示的なインターフェイスに関する5つの回答。:D –

+0

はい、私のほうが改善された解決策を提示しています:deal::) –

+0

私は "彼の答えを良くする人"には参加しません。 :) –

0

1つのオプションはinterfaces explicitlyを実装することです。

ダウンサイド - 常にMyClassをキャストする必要があります。

関連する問題