方法返回一个接口

13

大家好,

我在思考这行代码:

IDataReader myReader = questDatabase.ExecuteReader(getQuest);

我正在使用 DAAB,但是我不明白 ExecuteReader(DbCommand) 方法返回 IDataReader 接口的含义和用法。

可以有人解释一下吗?


我正在学习接口,也有同样的问题。Pablito的答案正是我在寻找的,并确认了我正在正确地构建我的实现。谢谢大家!! - Chris Porter
6个回答

16

它允许您使用DataReader而无需知道您正在使用哪种类型的DataReader(即SqlDataReader,OleDbDataReader,EtcDataReader),因此如果将来有一天您想更改正在使用的数据读取器,它不会影响您的逻辑,换句话说,它给您提供了抽象。

例如:

您可以使用

IDbCommand command = GiveMeSomeCommand();
IDataReader r = command.ExecuteReader();

在不知道您使用的提供程序是哪个的情况下,可能会有以下情况:

private static IDbCommand GiveMeSomeCommand()
{
    return new OleDbCommand();
}

或者它可以是

private static IDbCommand GiveMeSomeCommand()
{
    return new SqlCommand();
}

或者其他什么。

编辑:

你也可以使用DBFactories。

DbProviderFactory factory = GiveMeSomeFactory();
IDbCommand command = factory.CreateCommand();
IDataReader r = command.ExecuteReader();

//and create more objects
IDataAdapter adapter = factory.CreateDataAdapter();
IDbConnection conn = factory.CreateConnection();

然后在其他层中创建您的提供程序。

private DbProviderFactory GiveMeSomeFactory()
{
    if(something)
        return SqlClientFactory.Instance;
    else if(somethingElse)
        return OracleFactory.Instance;
    else if(notThisAndNotThat)
        return MySqlFactory.Instance;
    else
        return WhateverFactory.Instance;

}

2
我真的非常感谢大家,你们的奉献让我感到惊喜,能够加入这样的社区真是太好了。谢谢大家。 - netseng

6
该方法将返回一个对象,该对象是一个类的实例,并且该类类型将支持IDataReader接口。
重点是,对象的类型并不重要,重要的是该类实现了接口。
如果你开车,你不需要知道它是福特还是丰田,你都可以用同样的方式驾驶汽车。
驾驶“接口”是相同的,一旦汽车支持该接口,你就可以驾驶它。
同样的道理适用于IDataReader接口,一旦返回的类支持该接口,你就可以使用它。

5
“返回一个接口”实际上意味着:返回一个实现该接口的某个类的实例。在这种情况下,它返回一个非常类似于SqlDataReader对象的对象,使您能够执行像Read()这样的方法,并实现IDisposableIDataRecord接口。

我真的非常感谢大家,你们的奉献让我感到惊喜。能够加入这样的社区真是太棒了。谢谢大家! - netseng
这是类似于多态的概念吗(即对象指针可以指向任何继承自Object的引用类型)? - John Smith

4
它返回一个接口,因为接口的实现并不重要,只有接口提供的API才是重要的。

我真的非常感谢大家,你们的奉献让我感到惊喜,能够加入这样的社区真是太好了。谢谢大家。 - netseng

3
它并不是直接返回一个接口,而是返回一个支持该接口的对象。

非常感谢大家,你们的奉献让我非常惊喜,能够加入这样的社群真是太好了。谢谢大家。 - netseng

3
它返回一个实现这个特定接口的对象,这就是你真正关心的。该对象是一个 IDataReader,可以执行所有 IDataReader 的方法。

我真的非常感谢大家,你们的奉献让我感到惊喜,能够加入这样的社区真是太好了。谢谢大家。 - netseng
这就是我喜欢StackOverflow的原因:p - random

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接