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");
    }
}

我知道可以像在派生类中那样设置连接字符串,但我想让它保持静态,因此我不会在派生类的每个方法中设置属性......有什么想法吗?

4

3 回答 3

2

是:将连接字符串作为参数传递给方法。

  • 字段的行为不具有多态性,因此声明DataAccessDb1无效
  • static和多态性不混合

所以基本上,如果你想要多态行为,你应该使用实例成员。如果您真的不需要多态行为,请将任何变体(例如连接字符串)作为方法的参数传递。

于 2011-09-15T13:28:53.287 回答
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");
    }
}
于 2011-09-15T13:33:24.370 回答
0

我认为您应该只在抽象类中有一个 ExecuteSql 方法,并且所有派生类都将使用各自的连接字符串实现 ExecuteSql,

    public abstarct string ConnectionString{get;set;}

可以从基类中删除。

于 2011-09-15T13:36:42.997 回答