覆盖一个方法(返回类型DBDataReader)并返回一个不同的类型(SQLDBDataReader) [英] Override a method (return type DBDataReader) and return a different type(SQLDBDataReader)

查看:106
本文介绍了覆盖一个方法(返回类型DBDataReader)并返回一个不同的类型(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆