2011-07-11 27 views
1

我在數據庫中有兩個幾乎用於同一事物的表,但這些表沒有完全相同的結構。OOP - 將兩個表放入同一個對象

比方說,我有一個手動請求表和自動請求的另一個表。我必須將兩個表加載到同一個GridView中,並使用自定義業務對象。

爲了說明這個問題,我將調用TManualReqTable和TAutomaticReqTable。

TManualReqTable 
- ID 
- Field1 
- Field2 
- Field3 
- Field4 

TAutomaticReqTable 
- ID 
- Field1 
- Field3 

在代碼中,我使用這兩個表相同的對象。我有一個與兩個表的所有屬性的接口,並且當我將數據加載到對象時,我正在檢查字段是否存在。

但我想這應該創建與兩個對象和一個超類與摘要方法。

您對此有何評論?

回答

4

我會創建一個描述字段&方法常見的兩種接口IRequest,然後接口&類ManualRequest和實現IRequest並添加獨特他們每個人的方法/字段AutomaticRequest

您可以使用IRequest作爲包含任何一種的東西的類型。當通過的東西,可以包括從任一數據迭代,你可以檢查每一個對象是否實現的接口:

foreach (IRequest obj in RequestList) { 
    // do stuff that uses the common interface 

    if (obj is IManualRequest) { 
    // do stuff specific to manual requests 
    } else if (obj is IAutomaticRequest) { 
    // likewise 
    } 
} 
2

我按照一般的規則,以避免造成,除非基類:

  1. 我已經設計或發現足以共性給予足夠的物質基類。

  2. 我有一個使用情況消耗作爲基類的類;如果我沒有任何可以對這些類的通用功能進行操作的東西,那麼在擁有一個基類(可以通過實現常見行爲的類的組合來實現相同的功能)中幾乎沒有價值。

  3. 需求是足夠穩定的,我相信基類抽象在未來不會有重大修改。隨着時間的推移,基類越來越難以修改。

2

IMO,忘記數據庫怎麼看起來像一兩​​分鐘。

  1. 想想應該怎麼做結構化作爲一個對象。
  2. 想想你想怎麼樣使用那個對象。如果你需要可視化,編寫一些不存在的對象的代碼,並調整它,直到它看起來優雅。
  3. 想想如何讓它發生。

model first development

希望它能幫助。

0

很好,有幾個假設我正在做在這裏,所以讓我做他們明確...

給出:

  1. 這主要是查詢/顯示邏輯的差異
  2. 顯示邏輯已經可以處理
  3. 底層對象被表示的空值是兩個項目之間的相同
  4. 有確定這是否是一個「manua的一個簡單的方法l'或'自動'呼叫

我會說繼承不是我會模擬它的方式。爲什麼?因爲它是同一個對象,而不是兩種不同的對象。你基本上只是不顯示幾個字段,因此不需要查詢它們。因此,我可能會嘗試完成一些事情,以明確兩者之間差異的本質(請記住,我打算用這種方式來展示組織它的方式,以便清楚地說明,任何特定的實現可能會有所不同需要;主要想法是蒐集處理差異它們是什麼:在基於某種條件得到什麼質疑差異

public enum EQueryMode 
{ 
    Manual, 
    Automatic 
} 

public class FieldSpecification 
{ 
    public string FieldName { get; set; } 
    public bool[] QueryInMode { get; set; } 

    public FieldSpecification 
     (
      string parFieldName, 
      bool parQueryInManual, 
      bool parQueryInAutomatic 
     ) 
    { 
     FieldName = parFieldName; 
     QueryInMode = new bool[] { parQueryInManual, parQueryInAutomatic }; 
    } 
} 

public class SomeKindOfRecord 
{ 
    public List<FieldSpecification> FieldInfo = 
     new List<FieldSpecification>() 
      { 
       new FieldSpecification("Field1", true, true), 
       new FieldSpecification("Field2", true, false), 
       new FieldSpecification("Field3", true, true), 
       new FieldSpecification("Field4", true, false) 
      }; 

    // ... 

    public void PerformQuery(EQueryMode QueryMode) 
    { 
     List<string> FieldsToSelect = 
      (
       from f 
        in FieldInfo 
       where 
        f.QueryInMode[(int)QueryMode] 
       select 
        f.FieldName 
      ) 
      .ToList(); 

     Fetch(FieldsToSelect); 
    } 

    private void Fetch(List<string> Fields) 
    { 
     // SQL (or whatever) here 
    } 
} 

編輯:哇我似乎無法使今天后不必。糾正我的語法!)