2016-07-24 6 views
0

私は、すべての具体的なインスタンスが同じインターフェイスから継承するいくつかの具体的なインスタンスをコレクションに追加しようとしています。しかし、それはコンパイルされません。異なる具体的なインスタンス(共通のインタフェースをすべて継承する)をコレクションに追加するにはどうすればよいですか?

// Common interface. 
public interface ISearchService<in TSearchOptions> where TSearchOptions : ISearchOptions 
{ .. } 

// Concrete #1. 
public class FooSearchService : ISearchService<FooSearchOptions> 
{ .. } 

// Concrete #2. 
public class BaaSearchService : ISearchService<BaaSearchOptions> 
{ .. } 

は、したがって、上記のコードでは、両方のFooBaaとの両方がISearchService<ISearchOptions>から継承するが、それぞれが独自の特定SearchOptionsタイプを定義しています。

それでは、私は(コンパイルされません)これをしようとしている:

var searchServices = new List<ISearchService<ISearchOptions>> 
{ 
    new FooSearchService(), 
    new BaaSearchService() 
}; 

I've written the full code up on .NET Fiddle

アイデアは、共通の基本インターフェイスを持つ具体的なインスタンスの共通コレクションを持っているということです。

私は、私が絶えず理解していないばかつきの愚かさのためにこれで失敗していると確信しています。

私はおそらくあまりにも多くをしようとしていると思った.. so I've tried a new .NET Diffle with something differentしかし、それも動作しません。

誰でもお手伝いできますか?

私はちょうど一般的な汎用インタフェースの混合袋をしたい:(

+0

私はあなたが "共通のインターフェースを実装する"ことを意味すると思います。継承はクラス/サブクラスの概念です( "implements"と "inherits"の検索)。適切な言語の概念を使用して、学習しているかもしれない他の読者を混乱させないようにすることが最善です。 –

答えて

0

あなたはこれにコードを変更するときには、コンパイルされます。

public interface ISearchService<out TSearchOptions> where TSearchOptions : ISearchOptions 
{ } 
1

あなたが代わりにinoutを使用する必要があります。

outは、covariantを意味します。つまり、引数はクラスからその基本クラスの1つに変更できます。メソッドの戻り値の型(出力)、メソッドの結果を基本クラスとして使用できる場合は、その派生クラスのいずれかを取ることができます。

inは、contravariantを意味します。これは、引数がクラスからそれから派生したクラスに変更できることを意味します。メソッドのパラメータ(入力)を考えてください。メソッドが派生クラスを受け入れることができる場合は、基本クラスを必要とするメソッドに渡すことができます。

public interface ISearchService<out T> where T : ISearchOptions 
{ 
} 

:メソッドの入力と出力の思考がoutinを使用する際に覚えておくべきちょうど私の戦略である、それはまた、デリゲートジェネリック型パラメータの働き方です。基本的にcovariantcontravariantは、インターフェイスとデリゲートの両方で同じように動作します。

+0

URGH :(あなたの答えは...まで...インターフェースに次のメソッドを追加しました: 'Task SearchAsync(TSearchOptions searchOptions);' FML :( –

+0

@ Pure.Krome: 'out'は' output '、しかし無効な入力として使用しています:http://stackoverflow.com/questions/5041664/t-must-be-contravariantly-valid –

+0

これを行う方法はありません? –

関連する問題