2013-04-24 151 views
-1

問題:我有一個實體類(基類),我從中多次繼承它。現在我的所有派生類中都有一個Add-方法和一個Validate-方法。這些函數在所有派生類中都是相同的,它們是static從靜態基類方法調用靜態派生類方法

這是我Add - 方法

public static long Add(DBData[] UserData) 
{ 
    SortedDictionary<string, DBData> Data = new SortedDictionary<string, DBData>(); 

    foreach (DBData d in UserData) 
    { 
     Data.Add(d.FieldName, d); 
    } 

    if (Project.Validate(Data, OperationMode.Add)) 
    { 
     return DBUtility.Insert("Project", VSCommon.Serialise(Data)); 
    } 
    else 
    { 
     return -1; 
    } 
} 

現在,我在上面的函數有「Project」(2處,如果一個類型Project這個函數的對象屬於過了,另一個是數據庫表名) 。這些是我所有派生類中的唯一區別。我想把這個Add-方法放在我的基類中,這樣我就可以在每個派生類中多次跳過寫它。

我搜索,發現有些嘗試使用泛型,但我似乎沒有拿起它當我使用泛型聲明。當我打電話給Validate - 方法出現編譯錯誤。此外,我需要該類的名稱爲string以獲取相關的表名。

不知道我能夠定義我的問題,任何幫助表示讚賞。謝謝。

+0

你試圖使用泛型的地方?什麼是編譯錯誤? – 2013-04-24 08:26:41

+3

有很多你在這裏違反的面向對象編程的原則。 – 2013-04-24 08:31:10

+0

@丹尼斯,我同意我認爲我缺少概念部分,但我不確定,我試着寫ADD法作爲ADD ,並嘗試寫ADD法,然後嘗試使用T來代替Project.Validate,但是然後編譯器要求對類型進行強制轉換。我不知道該怎麼做?我的意思是我需要我的T是派生類型的,但我如何滿足編譯器的要求。 – 2013-04-24 08:44:09

回答

0

您可以添加一個(抽象基類爲&虛擬)方法,該方法返回此類的「項目」和其他類的其他字符串。然後從靜態的Add方法中引用它。

我想你也可以使用reflecion來獲取「Project」字符串,如果需要的話。不過,我建議不要這樣做,因爲它會增加數據庫和代碼之間不必要的耦合。

+0

I不需要返回Project。抽象方法絕對不是問題,因爲我不想重寫Method body,我已經這樣做了:)這就是我想要避免的。 – 2013-04-24 08:42:09

+0

使用這樣的方法,您可以在基類中實現Add()方法,只需調用建議的GetClassName()方法,而不是編寫「Project」。 – Simon 2013-04-24 08:43:50

0

我使用ADD功能如下修改解決我的問題

public static long Add<T>(DBData[] UserData) 
    { 
     SortedDictionary<string, DBData> Data = new SortedDictionary<string, DBData>(); 
     foreach (DBData d in UserData) 
     { 
      Data.Add(d.FieldName, d); 
     } 
     MethodInfo m = typeof(T).GetMethod("Validate"); 
     bool r = (bool)m.Invoke(null, new object[] { Data, OperationMode.Add }); 
     if (r) 
     { 
      return DBUtility.Insert(typeof(T).Name, VSCommon.Serialise(Data)); 
     } 
     else 
     { 
      return -1; 
     } 
    } 

然後,我有我的電話改變Project.Add <項目>(...);或Client.Add <客戶端>(...);而不是之前的Project.Add(...)。但是最後爲我節省了很多麻煩:)。

編輯:我只是意識到,Project.Add <客戶端>(...)也可以被調用,這將插入到客戶端對象。這是不好的,所以我的問題實際上並沒有解決:(。