派生类应该调用基类的静态方法,但是使用overriden属性

时间:2011-09-15 13:24:50

标签: c# class override abstract derived

我该怎么做?

情景:

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

我知道可以像在派生类中一样设置连接字符串,但是我想保持静态,因此我不会在派生类的每个方法中设置属性......任何想法?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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");
    }
}

答案 2 :(得分:0)

我认为你应该只在抽象类中有一个ExecuteSql方法,所有派生类都会用它们各自的连接字符串实现ExecuteSql,

    public abstarct string ConnectionString{get;set;}

可以从基类中删除。