【问题标题】:Overiding Static Classes in C#在 C# 中重写静态类
【发布时间】:2010-02-15 12:28:14
【问题描述】:

我有以下具有静态属性和方法的类,可帮助管理网站上的用户。我希望能够通过覆盖一些属性在其他项目中重用这个类。

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

}

【问题讨论】:

  • 只是一个一般性的想法,我认为,您可以不同意:避免直接使用 DataRows 等,它可能成为维护地狱,而是​​创建一个包含相关属性的域对象和将 DataRow 映射到该对象的属性。

标签: c# inheritance class


【解决方案1】:

没有。您不能覆盖静态成员。

你的想法不错。只需重构代码以使用实例成员并覆盖它们。

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

【讨论】:

    【解决方案2】:

    您混淆了概念:您可以覆盖方法,而不是属性。只需创建一个构造函数,该构造函数获取属性的初始化值并相应地初始化它们。此外,只有当整个 static 的东西都消失时才有意义。

    【讨论】:

      【解决方案3】:

      我愿意:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        • 1970-01-01
        • 2018-08-28
        • 2010-09-19
        • 1970-01-01
        相关资源
        最近更新 更多