2017-11-01 12 views
0

最近、ジェネリックインターフェイスに関する問題が発生しました。私はインターフェイスのリストを作成したかったのですが、一般的なインターフェイスでは簡単ではありません。私はこのようなリストを作成することができた:new List<IModelCreator<IDataCollection>>();しかし、私は醜いようだと思う。インターフェイスを継承していますが、メソッドをオーバーライドしていません

今私は2つのインターフェイスを持っています。 1つは一般的なものと1つはありません。ここで私は今、使用するインターフェイスは、次のとおりです。

public interface IModelCreator 
{ 
    IDataCollection GetModelFromPath(string path); 
} 

public interface IModelCreator<T>: IModelCreator where T : IDataCollection 
{ 
    new T GetModelFromPath(string path); 
} 

IModelCreatorがモデルにファイルパスをオンにし、Tはそれがになってしまいますモデルであるクラスです。だから今私のクラスでこれを使用し、私はこれを得る:

public abstract T GetModelFromPath(string path); 

IDataCollection IModelCreator.GetModelFromPath(string path) 
{ 
    return GetModelFromPath(path); 
} 

(私はそれを要約した)。しかし、これを2の代わりに1つのメソッドにする方法はありませんが、同じ機能を備えていますか?

私は非ジェネリックインターフェイスだけでも試しました。私は、このような抽象クラスがあります。

public abstract class DocumentConverterCreatorBase<T>: IModelCreator where T: IDataCollection 

をしかし、私は私のジェネリックTとして戻り値の型を使用することができませんでした。そして私は理由を知らない。

+0

ヒントは:あなたが良いデザインでメンバーの前に 'new'を配置する必要がありません。それはバンドエイドです。 –

+0

@HenkHolterman私はちょっと嬉しかったです。私はそれを思いつくことができたし、私のポストで私が話したリストの変種も出てきた。私はちょうど私が正しい方向に私を助けるいくつかの答えを得ることができることを願っています。 – patrick

答えて

0

は、私はあなたがこれを行うことができると思います。

public class ModelList : List<IModelCreator<IDataCollection>> { } 

//And then use it like this 
ModelList l = new ModelList(); 
+0

これは本当にクリーンな方法です。ありがとう、ありがとう!空のクラスを持つのは奇妙ではありませんか?それとも、抽象的なものを拡張しているので、私たちはそれを存続させることができますか? – patrick

+0

私はまったくそう思わない。メソッド、ヘルパー、または操作を支援するその他のものをリストに追加できるようになりました。また、 "List >"と入力すると、覚えやすくなります。 – acivic2nv

+0

新しい型を作成せず、代わりにエイリアスを使用する代わりの方法は次のとおりです。 'Using ModelList = List >;' –

関連する問題