覆盖一个方法(返回类型DBDataReader)并返回一个不同的类型(SQLDBDataReader) [英] Override a method (return type DBDataReader) and return a different type(SQLDBDataReader)
问题描述
我目前正在实施一个可以从不同数据库读取数据的小型软件。下面是代码:
I am currently implementing a small software that could read data from different DataBases. The followin is the code:
interface Fetch
{
Dictionary<string, DbDataReader> GetData();
}
abstract class Conn : Fetch
{
abstract public void Connect();
abstract public Dictionary<string, SqlDataReader> GetData();
}
class SqlConn : Conn
{
public override void Connect()
{
_connection = new SqlConnection(_connectionString);
try
{
_connection.Open();
}
catch (SqlException dbe)
{
throw dbe;
}
}
public override Dictionary<string, SqlDataReader> GetData()
{
using (_connection)
{
Dictionary<string, SqlDataReader> dataDictionary = new Dictionary<string, SqlDataReader>();
_xmlDoc.Load("Queries.xml");
XPathNavigator navigator = _xmlDoc.CreateNavigator();
XPathNodeIterator iterator = navigator.Select("//query");
while (iterator.MoveNext())
{
_command = new SqlCommand(iterator.Current.ToString());
_command.Connection = _connection;
_command.CommandText = iterator.Current.ToString();
SqlDataReader reader = _command.ExecuteReader() as SqlDataReader;
dataDictionary.Add(iterator.Current.GetAttribute("name", ""), reader);
}
return dataDictionary;
}
}
}
class OraConn : Conn
{
public override void Connect()
{
_connection = new OracleConnection(_connectionString);
}
public override Dictionary<string, OracleDataReader> GetData()
{
using (_connection)
{
Dictionary<string, OracleDataReader> dataDictionary = new Dictionary<string, OracleDataReader>();
_xmlDoc.Load("Queries.xml");
XPathNavigator navigator = _xmlDoc.CreateNavigator();
XPathNodeIterator iterator = navigator.Select("//query");
while (iterator.MoveNext())
{
_command = new OracleCommand(iterator.Current.ToString());
_command.Connection = _connection;
_command.CommandText = iterator.Current.ToString();
OracleDataReader reader = _command.ExecuteReader() as OracleDataReader;
dataDictionary.Add(iterator.Current.GetAttribute("name", ""), reader);
}
return dataDictionary;
}
}
}
但是我的问题是return类型,SQLDataReader和OraDataReader。
这会导致一个编译错误,表示
But My problem is the return type, SQLDataReader and OraDataReader in the derived class. This causes a compiler error that states
'错误2'DashBoard.Connection.OraConn.GetData必须是System.Collections.Generic.Dictionary以匹配重写的成员DashBoard.Connection.Conn.GetData()
。
‘Error 2 'DashBoard.Connection.OraConn.GetData()': return type must be 'System.Collections.Generic.Dictionary' to match overridden member 'DashBoard.Connection.Conn.GetData() ’.
我如何解决这个问题?还是有其他方法来实现这个功能?
谢谢!
How can I solve this problem? Or is there other ways to implement this funtion? Thank you!
推荐答案
方法签名必须保持不变,但只要子类继承从 DbDataReader
可以返回其他 DbDataReader
类型,例如 SqlDataReader
它将编译。
The method signature has to stay the same, but as long as your sub-classes inherit from DbDataReader
you can return other DbDataReader
types such as SqlDataReader
and it will compile.
例如:
abstract class DbDataReader
{
// ...
}
class SqlDataReader : DbDataReader
{
}
// ...
class SqlConn : Conn
{
public override Dictionary<string, DbDataReader> GetData()
{
return new Dictionary<string, DbDataReader>
{
{ "Key", new SqlDataReader() }
}
}
}
这篇关于覆盖一个方法(返回类型DBDataReader)并返回一个不同的类型(SQLDBDataReader)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!