1

たとえば、私は一般的なインターフェースを持っています

IWhatEver<T> : where T : ....
{
    T DoStuff(object value);
}

class Foo : IWhatEver<string> {...}
class Bar: IWhatEver<double> {...}

このインターフェイスは、いくつかのクラスによって実装されます。

このインターフェイスのインスタンスをリストに格納する方法と、DoStuff 関数を呼び出す方法を教えてください。

このようなもの:

List<IWhatEver<????>> whatEvers = new List<IWhatEver<????>>();  // doesnt work...

whatEvers.Add(new Foo());
whatEvers.Add(new Bar());


var whatWillThisBe = whatEvers.Select(w => w.DoStuff(withSomeObject));

これは不可能だと思いますが、ここで何かを忘れたのではないでしょうか?

4

1 に答える 1

2

1 つのオプションは、非ジェネリックの基本インターフェイスを作成し、そこからジェネリックを継承することです。

IWhatEver 
{
    object DoStuff(object value);
}

IWhatEver<T> : IWhatEver where T : ....
{
    new T DoStuff(object value);
}

IWhatEver から継承し、 をIWhatEver.DoStuff呼び出すことによって明示的に実装する基本抽象クラスを持つこともできIWhatEver<T>.DoStuffます。

abstract class BaseWhatEver<T> : IWhatEver<T>
{
    abstract T DoStuff(object value);

    object IWhatEver.DoStuff(object value)
    {
          return ((IWhatEver<T>) this)DoStuff(value);
    }
}
于 2013-04-17T14:07:53.163 に答える