繁体   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