2012-05-15 9 views
7
public abstract Column<T> 
{ 
    private T Value {get;set;}  

    public abstract string Format(); 

} 

public class DateColumn : Column<DateTime> 
{ 
    public override string Format() 
    { 
     return Value.ToString("dd-MMM-yyyy"); 
    } 
} 

public class NumberColumn : Column<decimal> 
{ 
    public override string Format() 
    { 
     return Value.ToString(); 
    } 
} 

問題は、これらをジェネリックコレクションに追加することです。私は本当にこの目標を達成するために何かアドバイスをいただければ幸い収集などに同じコレクション内の異なるGenerics T

IList<Column<?>> columns = new List<Column<?>() 

を、私はその可能性を知っているが、どのように私は複数のタイプを格納することができます。目標は、同じリストに異なる列タイプを格納することです。私はHibernateとdiscriminatorを使って適切なオブジェクトをロードしています。値はクラスの型を持つ必要があります。

ご協力いただきありがとうございます。

+0

にそれを格納することです。ジェネリックスは型の安全に役立ちます。関係なく、あなたが本当にこれをやりたければ、列であなたのリストを埋めることができませんでしたか? – Killnine

+0

いいえ、私は列を使用しようとしました私は問題が実際に多型を介して定義された値を持つことにあり、それをコレクションに格納することができると思う。私は、さまざまな列の種類を読み込むために弁別子を​​使用します。 – Jonathan

+0

この質問の[いくつか](http://stackoverflow.com/q/3215402/590790)[duplicates](http://stackoverflow.com/q/3777057/590790)が既にあります。 [JaredParの投稿](http://stackoverflow.com/a/10606974/590790)の「ベースタイプ」ソリューションに加えて、[非標準ラッパーを作成するためのアダプターパターンに従うことを提案したいと思いますLiskov Substitution Principleが壊れていないように、この目的(http://stackoverflow.com/a/34417767/590790)を参照してください。 –

答えて

13

List<T>に一緒に格納するには、列に共通の基本タイプが必要です。 DateColumnNumberColumnの最も近い共通基底クラスはobjectです。どちらもColumn<T>から派生するのではなく、Column<T>の具体的かつ異なるインスタンス化ではありません。ここ

一つの解決策は、Column<T>から派生した非ジェネリックColumnタイプを紹介し、私はこのポイントについて混乱していますList

public abstract class Column { 
    public abstract object ValueUntyped { get; } 
} 

public abstract class Column<T> : Column { 
    public T Value { get; set; } 
    public override object ValueUntyped { get { return Value; } } 
} 

... 

IList<Column> list = new List<Column>(); 
list.Add(new DateColumn()); 
list.Add(new NumberColumn()); 
+5

あなたは、基本クラスの代わりにインターフェースを考えてもよいでしょう。 –

2

ジェネリックスはすべてタイプの指定に関するものです。ダイナミックタイプを使用する場合は、代わりに古典的なArrayListを使用してください。

+2

このケースでは、OPが動的な型指定を必要としているとは思わないが、代わりに基底型と多態性を利用したいと思う。 – JaredPar

+0

はい、あなたは正しい@JaredParです。難しい – Jonathan

+2

あなたが正しいです、私は詳細な答えを+1しました。 – Pol

3

カラムの非ジェネリック共通インタフェースの多くをラップする非汎用のColumnクラスから導き出すと、おそらく意味があります。リストをList<Column>と宣言してください。

+1

...そして、@ JaredParが言ったこと... – spender

関連する問題