方法返回一个接口
大家好,
我正在考虑这行代码
IDataReader myReader = questDatabase.ExecuteReader(getQuest);
我正在使用DAAB,但我无法理解方法ExecuteReader(DbCommand)返回IDataReader接口的意义和含义是什么。
任何人都可以解释,拜托
它允许您使用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; }
该方法将返回一个对象,该对象是一个类的实例,该类的类将支持IDataReader
。
关键是,对象的类型并不重要,只是该类实现了接口。
如果你正在开车,你不需要知道它是福特,还是丰田,你也可以用同样的方式驾驶汽车。
驱动界面是一样的,一旦汽车支持界面,你就可以开车了。
与IDataReader
同上,一旦返回的类支持该接口,您就可以使用它。
它返回一个接口,因为接口的实现并不重要,只是接口提供的API。
“返回一个接口”真的意味着:
返回实现该接口的某个类的实例
在这种情况下,它返回一个非常类似于SqlDataReader
对象的对象,它允许您执行Read()
类的方法并实现IDisposable
和IDataRecord
接口。
它不是返回一个接口本身,而是一个支持该接口的对象。
它返回一个实现这个特定接口的对象,这就是你真正关心的。 该对象是一个IDataReader
,可以执行IDataReader
具有的所有方法。