2012-11-27 16 views
6

私はこのような外観の一般的なフラットファイルリーダーを構築しています。何とかこのジェネリック医薬品を使いすぎてもいいですか?

public class GenericReader<TComposite, THeader, TData, TTrailer> 
    where TComposite : GenericComposite<THeader, TData, TTrailer>, new() 
    where THeader : new() 
    where TData : new() 
    where TTrailer : new() 
{ 
    public TComposite Read() 
    { 
     var composite = new TComposite(); 

     composite.Header = new THeader(); 
     composite.Data = new TData(); 
     composite.Trailer = new TTrailer(); 

     return composite; 
    }   
} 

このように消費される可能性があります。

var reader = new GenericReader<Composite<Header, Data, Trailer>, Header, Data, Trailer>(); 

var composite = reader.Read(); 
Console.WriteLine(composite.Data.SomeProperty); 

Console.ReadLine(); 

ここに使用されるクラスがあります。

public class Composite<THeader, TData, TTrailer> : GenericComposite<THeader, TData, TTrailer> 
{ 

} 

public class GenericComposite<THeader, TData, TTrailer> 
{ 
    public THeader Header { get; set; } 

    public TData Data { get; set; } 

    public TTrailer Trailer { get; set; } 
} 

public class Header { 
    public string SomeProperty { get { return "SomeProperty"; } } 
} 

public class Data { 
    public string SomeProperty { get { return "SomeProperty"; } } 
} 

public class Trailer { 
    public string SomeProperty { get { return "SomeProperty"; } } 
} 

私はGenericReaderでそのジェネリック型情報を削除するか、またはカプセル化できるか方法はありますか?私は何かが欠けているものを私に見せるために余分な目を探しています。私たちはすでにインタフェースを返すことで何かを行い、消費者をキャストするようにしましたが、それは私の意見では間違った場所に責任を移してしまい、さらに小さなパフォーマンス上のペナルティがあります。

ありがとうございました。

編集:私はTCompositeは必要ありません。私はGenericCompositeを返すことができます。どうすればそれを逃すことができますか?

public class GenericReader<THeader, TData, TTrailer> 
    where THeader : new() 
    where TData : new() 
    where TTrailer : new() 
{ 
    public GenericComposite<THeader, TData, TTrailer> Read() 
    { 
     var composite = new GenericComposite<THeader, TData, TTrailer>(); 

     composite.Header = new THeader(); 
     composite.Data = new TData(); 
     composite.Trailer = new TTrailer(); 

     return composite; 
    }   
} 

public class GenericComposite<THeader, TData, TTrailer> 
{ 
    public THeader Header { get; set; } 

    public TData Data { get; set; } 

    public TTrailer Trailer { get; set; } 
} 
+2

[コードレビューSE](http://codereview.stackexchange.com/)を参照してください。このようなレビュータスクには本当に適しています。 – tmesser

+3

私はこの質問に合っていると思います。ジェネリック型の引数(と型システムの話は間違いなくSOの話題です)とそれを単純化する方法のように、コードレビューではありません。 –

+0

私にとってGenericReaderは私が何かを紛失していない限り、工場から一般的なタイプです。直後にそれを処分するためだけに作成するような音がします。では、Compositeを提供する以外にGenericReaderが存在する理由はありますか?コンポジットにインスタンスを生成する静的メソッドがありませんでしたか? – LightStriker

答えて

2

あなたが持っているジェネリック制約の型宣言の必要性を取り除く方法はありません。

ただし、ご利用の場合は、これが最も一般的な動作であることを示唆している:

var reader = new GenericReader<Composite<Header, Data, Trailer>, 
    Header, Data, Trailer>(); 

これはあなたが特定のパターンが使用される頻度についての仮定を作ることができる場合であれば、あなたが継承することができますより簡単に使用できる閉じた型定義を持つジェネリッククラスから型(または型のセット)を取得します。上記の場合

、あなたは、ベース用(一般的な定義に加えて)最も一般的な例を、これらのクラスを提供することができます。

public class Composite : GenericComposite<Header, Data, Trailer> { } 

public class GenericReader : GenericReader< 
    Composite, Header, Data, Trailer> 
{ } 

そのように同じように使用されるであろう:

var reader = new GenericReader(); 

var composite = reader.Read(); 

Console.WriteLine(composite.Data.SomeProperty); 

Console.ReadLine(); 

高度に特殊化されたケースに使用する汎用パラメータのタイプは引き続き使用できますが、一般的な使用例(分析/ドメインの知識によって判断します)では、最も一般的なものを特定し、支援する型パラメータを設定します。

+0

これは私が今やっていることです。それを質問に追加する必要があります。むしろまともなソリューションです! – JefClaes

+0

@JefClaes最近、私は3つの一般的なパラメータがあり、2つは通常のユースケースでした。そして、私が推奨するタイプのパラメータ(私が推奨したもの)を継承したものを提供することが私にとって最善であることがわかりました。おそらく、三日月状。 – casperOne

関連する問題