2011-09-15 43 views
0

我該怎麼做?派生類應調用基類的靜態方法,但需要重寫屬性

場景:

abstract class DataAccess 
{ 
    public abstract string ConnectionString { get; set; } 

    public static DataTable ExecuteSql(string sql) 
    { 
     // ... 
    } 

    public static object ExecuteStoredProc(string storedProcName, ...) 
    { 
     // ... 
    } 
} 

abstract class DataAccessDb1 : DataAccess 
{ 
    public override string ConnectionString = "SetDbSpecificConnectionStringHere"; 

    public static DataTable GetStuff() 
    { 
     // Call the method with the ConnectionString set HERE. 
     return ExecuteSql("select * from stuff"); 
    } 
} 

我知道它知道可以設置連接字符串像在派生類中,但我想保持它的靜態的,所以我不會設置該屬性在每個方法派生類...任何想法?

回答

2

是:將連接字符串作爲參數傳入方法。

  • 字段不規矩多態,所以在DataAccessDb1的聲明是無效的
  • static和多態性不混合

所以基本上,如果你想多態行爲,你應該使用實例成員。如果您不需要多態行爲,請將任何變體(例如連接字符串)作爲該方法的參數。

+0

好吧,我認爲這將有可能使它更加優雅。謝謝喬恩! – timmkrause

0

在C#中沒有靜態繼承,所以你的目標是讓ConnectionString有一個靜態成員並覆蓋它不起作用。重新思考你的設計 - 將ConnectionString靜態地表示爲真,說這個字段在所有的DataAccess實例上應該是相同的,因爲它是在類型本身上定義的。

有什麼特別的原因,你用靜態方法 - 使用實例方法和設置在構造連接字符串會的工作:

public class DataAccessDb1 
{ 
    public string ConnectionString {get;set;} 

    public DataAccessDb1() 
    { 
     ConnectionString = "SetDbSpecificConnectionStringHere"; 
    } 

    public void DataTable GetStuff() 
    { 
     return DataAccess.ExecuteSql(ConnectionString, "select * from stuff"); 
    } 
} 
+0

派生類也應該是靜態的,所以我不能使用構造函數。 :( – timmkrause

+0

出於好奇 - 爲什麼你想要它是靜態的? – BrokenGlass

+0

因爲我不想創建數十個執行我的數據操作的對象,我覺得只需調用「Customer.GetAddress()」就沒有實例化「客戶」,爲我節省了很多「客戶c =新客戶()」,僅僅是一個小例子...... – timmkrause

0

我現在想什麼,你應該只在抽象類中的ExecuteSQL方法和所有派生類將與它們各自的連接字符串執行的ExecuteSQL,

public abstarct string ConnectionString{get;set;} 

可以從基類去除。

+0

是的,這就是Jon說的,但現在我還需要將連接字符串作爲參數傳遞給ExecuteSql() 。/ – timmkrause

+1

通常你應該避免使用靜態的,你的問題可以通過使用單例和工廠模式來解決,你將有一個單體工廠類生產具體的DataAccessDb對象,你不必在你應該向單件工廠詢問DBAccessDb1的具體對象,它應該需要連接字符串,我知道它很難用文字解釋,但我沒有太多時間寫現在代碼:( – DotNetUser

+0

真是無賴。這聽起來很不錯,但我並沒有把它介紹給大家。 – timmkrause

相關問題