2012-12-05 59 views
0

我很抱歉,如果這看起來非常像我幾周前問過的類似問題;我正在學。工廠列表

我有一個函數應該返回一個對象列表 - 有點像一個工廠。在下面的例子中,我有兩個類卡車和汽車誰都從超類車輛繼承。該功能不起作用,但它應該顯示我想要完成的。

編輯:忘了說如何沒有工作。那麼,函數會創建一個例如卡車列表,但不能返回,因爲返回值必須是列表車輛。我不知道如何轉換創建的列表,或者即使它可以轉換。

很顯然,我主要是在尋求如何讓這個該死的東西上班的建議!但是,我也很感激關於如何讓它更具可擴展性的任何想法 - 爲每一個可能的車輛類別提供「案例」聲明並不會讓我感到開心。

v.Populate函數就在那裏用DataReader中的數據填充對象。不應該影響手頭的問題。

調用函數,在這種情況下,我想要一個卡車對象列表:返回PopulateList(「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的)所有非必要的代碼被剝離。返回值應該是一個List,其中只有一個空對象。

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; 
} 
+0

什麼是不與您的代碼的工作?乍一看,它看起來好像它應該工作。 –

+0

你在哪裏/如何調用該方法? –

+0

儘量避免像'它不工作'的陳述。改爲描述結果和/或例外。 – Rotem

回答

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); 
+0

謝謝你,Wiktor。這是我需要的。只是一個細節:簽名應該結束「...其中T:IPopulate,new()」 –

+0

對,我編輯了答案。 –

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; 
    } 
0

創建通用方法:

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

用法:

var truck = CreateInstance<Truck>(); 
var car = CreateInstance<Car>();