0

インスタンスのリストを返すメソッドを設計しています。各インスタンスは実際には異なるデータ型です。

以下は私のドラフトデザインです。推奨事項が必要です

public class abstract Base
{
    //DataType is an enum
    public abstract DataType Type { get; set; }

    public abstract BaseType Value { get; set; }
}

public abstract class BaseType
{
}     

public class MyString:BaseType
{
}     

public class MyInt:BaseType
{
}     

 //string for example    
public class Type1:Base
{
    public override DataType Type
    {
        get { return DataType.Type1; }
        set;
    }

    public override BaseType Value
    {
        get { return new MyString("a"); }
        set;
    }
}

public class Type2:Base
{
    public override DataType Type
    {
        get { return DataType.Type2; }
        set;
    }

    public override BaseType Value
    {
        //MyInt for example
        get { return new MyInt(10); }
        set;
    }
}

メソッドは

List<Base> GetValues();

呼び出し元はそのようなものを書くことが期待されています

List<Base> values = GetValues();

foreach(var value in values)
{
    switch(value.Type)
    {
        case DataType.MyString:
            MyString str = value.Value as MyString;
            break;

        case DataType.MyInt:
            MyInt str = value.Value as MyInt;
            break;
    }
}

私の質問は、そのための最良の設計は何ですか? ジェネリックをより適切に使用するにはどうすればよいですか?

4

1 に答える 1

1

一般的な基本クラスをお勧めします。

public abstract class Base<T>
    where T : BaseType
{
    public abstract DataType Type { get; }

    public abstract T Value { get; set; }
}

Type1 は次のようになりました。

public class Type1 : Base<MyString>
{
    public override DataType Type
    {
        get { return DataType.MyString; }
    }

    public override MyString Value
    {
        get;
        set;
    }
}

しかし、私は何GetValuesであるかを知りません。同じ型の値のリストを返す場合は、ジェネリックでもある必要があります。

public List<Base<T>> GetValues<T>()
    where T : BaseType
{
    return theList;
}

異なる型の要素を返す場合は、別の非ジェネリック基本クラスを使用できます。

public abstract class Base
{
    public abstract DataType Type { get; }
}

public abstract class Base<T> : Base
    where T : BaseType
{
    public abstract T Value { get; set; }
}

GetValuesメソッドは次のようになります。

public List<Base> GetValues()
{
    return theList;
}

DataType プロパティを引き続き使用できるように、非ジェネリック部分を非ジェネリック基本クラスに移動したことに注意してください。

Valueプロパティにアクセスするには、値をそれぞれの型にキャストする必要があります。

List<Base> values = GetValues();

foreach (Base value in values)
{
    switch (value.DataType)
    {
        case DataType.MyString:
            MyString myString = value as MyString;
            ...

        case DataType.MyInt:
            MyInt myInt = value as MyInt;
            ...
    }
}

DataTypeオブジェクトのタイプに関する情報を取得するためにのみプロパティを使用しているようです。これは必要ありません。is次の演算子を使用できます。

foreach (Base value in values)
{
    if (value is MyString)
    {
        MyString myString = value as MyString;
        ...
    }
    else if (value is MyInt)
    {
        MyInt myInt = value as MyInt;
        ...
    }
}
于 2013-10-05T01:04:42.503 に答える