web-dev-qa-db-ja.com

ジェネリックメソッドを使用したインターフェイスの実装

私はこれに空白を描いていますが、私が書いた以前の例を見つけることができないようです。クラスでジェネリックインターフェイスを実装しようとしています。インターフェイスを実装すると、Visual Studioが汎用インターフェイスのすべてのメソッドを実装していないというエラーが継続的に発生するため、何かが正しく機能しないと思います。

ここに私が取り組んでいるもののスタブがあります:

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

それで、私のクラスはどのように見えるべきですか?

53

次のように、インターフェイスを作り直す必要があります。

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
    }
}
93
Reed Copsey

おそらく次のようにインターフェースを再定義したいと思うでしょう。

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

メソッドは、宣言されているジェネリックインターフェイスのジェネリックパラメーターを使用(再利用)したいと思うと思います。そして、おそらく、それらを独自の(インターフェイスとは異なる)ジェネリックパラメーターを持つジェネリックメソッドにしたくないでしょう。

再定義したとおりにインターフェイスを指定すると、次のようなクラスを定義できます。

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

または、次のような汎用クラスを定義します。

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

-編集

他の答えはより良いですが、見た目が混乱している場合は、VSにインターフェイスを実装させることができます。

以下に説明するプロセス。

さて、Visual Studioは次のように見えるはずだと言っています。

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
}

私がやったことは、インターフェースを書いて、それをクリックして、VSが私の実装を生成するように小さなアイコンがポップアップするのを待つことに注意してください:)

1
Noon Silk