方法返回一个接口

时间:2009-02-04 13:03:34

标签: c# .net oop interface

大家好,

我正在考虑这行代码

IDataReader myReader = questDatabase.ExecuteReader(getQuest);

我正在使用DAAB,但我无法理解方法ExecuteReader(DbCommand)返回IDataReader接口的意义和含义是什么。

任何人都可以解释,请

6 个答案:

答案 0 :(得分:16)

它允许您使用DataReader而无需知道您正在使用哪种类型的DataReader(即SqlDataReader, OleDbDataReader, EtcDataReader),因此如果有一天您想要更改正在使用它的datareader将不会影响您的逻辑,换句话说,它给你抽象。 例如:

你可以使用

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;

}

答案 1 :(得分:6)

该方法将返回一个对象,该对象是一个类的实例,该类的类将支持IDataReader

关键是,对象的类型并不重要,只是该类实现了接口。

如果你开车,你不需要知道它是福特,还是丰田,你也可以用同样的方式驾驶汽车。

驾驶界面是相同的,一旦汽车支持界面,你就可以驾驶它。

IDataReader同上,一旦返回的类支持界面,就可以使用它。

答案 2 :(得分:4)

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

答案 3 :(得分:4)

“返回一个接口”实际上意味着:

  

返回实现该接口的某个类的实例

在这种情况下,它返回一个非常类似于SqlDataReader对象的对象,它允许您执行Read()之类的方法并实现IDisposableIDataRecord接口。

答案 4 :(得分:3)

它不是返回一个接口本身,而是一个支持该接口的对象。

答案 5 :(得分:3)

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