我有一个针对数据库无关的游标操作的抽象类。
基于此,有一些类实现了处理特定于数据库的方法的抽象方法。
问题是,基类构造函数需要调用抽象方法 - 当调用构造函数时,它需要初始化特定于数据库的游标。
我知道为什么不应该这样做,我不需要那个解释!
这是我的第一个实现,显然行不通 - 这是做法上的“错误方式”。 重写的方法访问派生类中尚未实例化的字段:
问题是,基类构造函数需要调用抽象方法 - 当调用构造函数时,它需要初始化特定于数据库的游标。
我知道为什么不应该这样做,我不需要那个解释!
这是我的第一个实现,显然行不通 - 这是做法上的“错误方式”。 重写的方法访问派生类中尚未实例化的字段:
public abstract class CursorReader
{
private readonly int m_rowCount;
protected CursorReader(string sqlCmd)
{
m_rowCount = CreateCursor(sqlCmd); //virtual call !
}
protected abstract int CreateCursor(string sqlCmd);
//...other (non-abstract) methods that assume a cursor exists
}
public class SqlCursorReader : CursorReader
{
private SqlConnection m_sqlConnection;
public SqlCursorReader(string sqlCmd, SqlConnection sqlConnection)
{
m_sqlConnection = sqlConnection; //field initialized here
}
protected override int CreateCursor(string sqlCmd)
{
//uses not-yet-initialized member *m_sqlConnection*
//so this throws a NullReferenceException
var cursor = new SqlCursor(sqlCmd, m_sqlConnection);
cursor.Create();
return cursor.Count();
}
}
我会跟进我的尝试来修复这个问题...
更新
覆盖的方法CreateCursor()
在数据库中创建了一个实际的游标。这对于许多被省略在类中的方法的正确运行至关重要。
CreateCursor()
必须在基本构造函数中调用,以便在构造函数返回时该类处于一致状态。我已经稍微更新了上面的代码以反映这一点。
CursorReader
知道sql
是什么吗? - hunter