0

これが数週間前に尋ねた同様の質問に非常によく似ている場合は、お詫び申し上げます。私は学んでいます。

オブジェクトのリストを返す関数があります-ファクトリーのようなものです。以下の例では、トラックと車の2つのクラスがあり、どちらもスーパークラスの車両から継承しています。この関数は機能しませんが、私が達成したいことを示しているはずです。

編集:それがどのように機能しなかったかを言うのを忘れました。この関数は、たとえばトラックのリストを作成しますが、戻り値は車両のリストでなければならないため、それを返すことはできません。作成したリストを変換する方法や、変換できるかどうかはわかりません。

明らかに、私は主に、いまいましいものを機能させる方法についてアドバイスを求めています!しかし、それをよりスケーラブルにする方法についてのアイデアもありがたいです。考えられるすべてのVehicleクラスに「case」ステートメントを含めることは私を幸せにしません。

v.Populate関数は、DataReaderからのデータでオブジェクトを埋めるためだけにあります。手元の問題に影響を与えるべきではありません。

関数を呼び出すと、この例では、Truckオブジェクトを含むリストが必要です 。returnPopulateList( "Truck"、gc);

private List<Vehicle> PopulateList(String type, GenericConnection gc)
{
    Vehicle v;
    var ret = new List<Vehicle>();
    var r = gc.ExecuteReader();
    while (r.Read())
    {
        switch (type)
        {
            case "Truck":
                v = new Truck();
                break;
            case "Car":
                v = new Car();
                break;
            default:
                throw new ArgumentException("Unknown Vehicle: " + type, "type");
        }
        v.Populate(r);
        ret.Add(v);
    }
    r.Close();
    return ret;
}

わかりやすくするために、ここに同じ関数のコピーを示しますが、必須ではないコード(主にDataReaderに関する)はすべて削除されています。戻り値は、空のオブジェクトが1つだけ含まれているリストである必要があります。

private List<Vehicle> PopulateList(String type)
{
    Vehicle v;
    var ret = new List<Vehicle>();
    switch (type)
    {
        case "Truck":
            v = new Truck();
        case "Car":
            v = new Car();
        }
    }
    ret.Add(v);
    return ret;
}
4

3 に答える 3

2

ジェネリックを使用しない理由:

public interface IPopulate {
   void Populate( DbDataReader dataReader );
}

....
private List<T> PopulateList<T>( GenericConnection gc )
    where T : IPopulate, new()
{
    T v;
    var ret = new List<T>();
    var r = gc.ExecuteReader();
    while (r.Read())
    {
        v = new T();
        v.Populate(r);
        ret.Add(v);
    }
    r.Close();
    return ret;
}

あなたはそれを次のように呼ぶでしょう

PopulateList<Truck>( connection );
PopulateList<Car>( connection );
于 2012-12-05T14:49:12.320 に答える
0

ジェネリック メソッドを作成できます。

private List<Vehicle> PopulateList<T>() where T: Vehicle
    {
        Vehicle v = new T();
        var ret = new List<Vehicle>();
        // main logic
        ret.Add(v);
        return ret;
    }
于 2012-12-05T14:54:18.023 に答える
0

ジェネリック メソッドを作成します。

public T CreateInstance<T>() where T : Vehicle, new()
{
    var obj = new T();
    return obj;
}

使用法:

var truck = CreateInstance<Truck>();
var car = CreateInstance<Car>();
于 2012-12-05T15:00:30.170 に答える