簡體   English   中英

在C#中覆蓋靜態類

[英]Overiding Static Classes in C#

我有以下帶有靜態屬性和方法的類,這些屬性和方法可幫助管理網站上的用戶。 我希望能夠通過重寫某些屬性在其他項目中重用該類。

public class Account {

    public static string sessionName = "Account";
    public static string tableName = "Accounts";

    public static bool isLoggedIn(){

        return HttpContext.Current.Session[sessionName] != null;

    }

    public static bool login(string email, string password){

        //connect to database and return user details from specified table
        DataTable t = Database.login(tableName, email, password);

        DataRow r = t.Rows[0];

        HttpContext.Current.Session[sessionName] = r;

        return true;

    }

    public static object val(string name){

        return ((DataRow)HttpContext.Current.Session[sessionName])[name];

    }

}

這基本上是使用屬性中定義的會話名稱登錄用戶並將其詳細信息存儲在會話的DataRow中。

是否可以執行以下類似操作,以將此類用於多種類型的用戶?

public class WebsiteUser : Account {

    public override string sessionName = "WebsiteUser";
    public override string tableName = "WebsiteUsers";

}

public class TradeUser : Account {

    public override string sessionName = "TradeUser";
    public override string tableName = "TradeUsers";

}

然后調用以下代碼以使用每個派生類。

if (WebsiteUser.isLoggedIn()){

    //manage website user

}

if (TradeUser.isLoggedIn()){

    //manage trade user

}

不可以。您不能覆蓋靜態成員。

你的主意很好。 只需重構代碼即可使用實例成員並覆蓋它們。

或更好的方法是,根據他的具體情況-將值作為構造函數參數傳遞。 您沒有覆蓋任何邏輯,只需要在字段中存儲和返回數據。

您在混淆概念:您可以覆蓋方法,而不是屬性。 只需構造一個使用屬性初始化值並相應地對其進行初始化的構造函數即可。 此外,這只有在整個static內容都消失之后才有意義。

我會:

  • 使sessionName和tableName為非靜態實例成員,在Account構造函數中初始化
  • 創建Account類的幾個靜態實例,分別命名為websiteUser和tradeUser
  • 使用不同的sessionName和tableName構造這些實例
  • 沒有Account類的子分類

而不是if (WebsiteUser.isLoggedIn()) ,代碼看起來像if (Account.websiteUser.isLoggedIn()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM