2009-08-28 19 views
40

私はこれを空白にしていますが、私が書いた前の例は見つからないようです。私は、クラスとジェネリックインターフェイスを実装しようとしています。私がインターフェイスを実装するとき、Visual StudioはGeneric Interfaceのすべてのメソッドを実装しているとは言えないので、何かがうまくいきません。一般的なメソッドでインターフェイスを実装する

public interface IOurTemplate<T, U> 
{ 
    IEnumerable<T> List<T>() where T : class; 
    T Get<T, U>(U id) 
     where T : class 
     where U : class; 
} 

それでは、私のクラスは、次のようになります。

は、ここに私が働いているかのスタブですか?

+1

間違った質問のタイトルを。通常のクラスとインタフェースには汎用メソッドがあり、メソッドには汎用インタフェースがあります。 – Kobor42

答えて

69

ので、同様にあなたは、あなたのインタフェースを手直しする必要があります

public interface IOurTemplate<T, U> 
     where T : class 
     where U : class 
{ 
    IEnumerable<T> List(); 
    T Get(U id); 
} 

その後、あなたはジェネリッククラスとしてそれを実装することができます

public class OurClass<T,U> : IOurTemplate<T,U> 
     where T : class 
     where U : class 
{ 
    IEnumerable<T> List() 
    { 
     yield return default(T); // put implementation here 
    } 

    T Get(U id) 
    { 

     return default(T); // put implementation here 
    } 
} 

または、あなたは、具体的にそれを実装することができます

public class OurClass : IOurTemplate<string,MyClass> 
{ 
    IEnumerable<string> List() 
    { 
     yield return "Some String"; // put implementation here 
    } 

    string Get(MyClass id) 
    { 

     return id.Name; // put implementation here 
    } 
} 
+0

パーフェクト。私は一般的な瓶を指定しなければならないことを知っていましたが、どこで(馬鹿を意図したのか)覚えられませんでした。ありがとうリード! –

+1

希望の結果は不可能かもしれませんが、IMOには一般的な方法がありません。技術的には、ジェネリックメソッドには独自のテンプレートパラメータがあるようです。 – Catskul

+0

あなたは正しいです。間違った質問タイトルですが、その質問に対しては良い答えです。 – Kobor42

9

は、私はあなたがおそらくこのようなあなたのインターフェイスを再定義したいと思う:

public interface IOurTemplate<T, U> 
    where T : class 
    where U : class 
{ 
    IEnumerable<T> List(); 
    T Get(U id); 
} 

を、私はあなたが方法が(再使用)宣言されているれている一般的なインターフェースの一般的なパラメータを使用したいと思います。おそらく、独自の(インターフェイスのものとは別の)ジェネリックパラメータを持つジェネリックメソッドを作成したくないと思うかもしれません。

編集 -

class Foo<T, U> : IOurTemplate<T, U> 
    where T : class 
    where U : class 
{ 
    public IEnumerable<T> List() { ... etc... } 
    public T Get(U id) { ... etc... } 
} 
+0

これをジェネリッククラスとして実装することもできます:class Foo :IOurTemplate - ジェイソンがどのオプションを後にしているのか分かりません。 –

+0

あなたはそうだ、私はそれを追加します。 – ChrisW

1

class Foo : IOurTemplate<Bar, Baz> 
{ 
    public IEnumerable<Bar> List() { ... etc... } 
    public Bar Get(Baz id) { ... etc... } 
} 

またはこのような一般的なクラスを定義します。私はそれを再定義として、あなたはこのようなクラスを定義することができるインタフェースを考えると

他の回答はより良いですが、どのように見えるかについて混乱している場合は、VSがあなたのためにインターフェイスを実装するようにすることができます。

以下に説明するプロセス。私はすべてが書き込みインタフェースは、その後、VSが発生持ってポップアップするためにそれをクリックすると、小さなアイコンを待ちだったこと

class X : IOurTemplate<string, string> 
{ 
    #region IOurTemplate<string,string> Members 

    IEnumerable<T> IOurTemplate<string, string>.List<T>() 
    { 
     throw new NotImplementedException(); 
    } 

    T IOurTemplate<string, string>.Get<T, U>(U id) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

注:

まあは、Visual Studioは、それは次のようになります私に語りました私のための実装:)

+0

参照:インターフェースで 'T'と' U'を特化していても(両方とも 'string'です)、メソッド自体は独自の別個の/別個のジェネリックパラメータを持っています... OP意図されました。 – ChrisW

+0

私は同意する、あなたのアドバイスが良いと思う、私はちょうどあなたがそれが見える方法について混乱している場合は、あなたのためのインターフェイスを実装するVSを得ることが可能であることを示しています。 –

関連する問題