在C#中覆盖静态类

时间:2010-02-15 12:28:14

标签: c# inheritance class

我有以下类,其中包含有助于管理网站用户的静态属性和方法。我想通过覆盖一些属性来重新使用这个类。

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

}

3 个答案:

答案 0 :(得分:6)

没有。您无法覆盖静态成员。

你的想法很好。只需重构代码即可使用实例成员并覆盖它们。

或者更好的是,在他的具体情况下 - 将值作为构造函数参数传递。您没有覆盖任何逻辑,您只需要在字段中存储和返回数据。

答案 1 :(得分:0)

您会混淆概念:您可以覆盖方法,而不是属性。只需创建一个构造函数,该构造函数接受属性的初始化值并相应地初始化它们。此外,只有整个static内容消失,才有意义。

答案 2 :(得分:0)

我会:

  • 创建在Account构造函数
  • 中初始化的sessionName和tableName非静态实例成员
  • 创建Account类的几个静态实例,例如, websiteUser and tradeUser
  • 使用不同的sessionName和tableName构建这些实例
  • 没有Account类的子类

代替if (WebsiteUser.isLoggedIn()),代码看起来像if (Account.websiteUser.isLoggedIn()