3

我有个问题。接口没有任何定义。接口无法实例化。此代码如何有效?

IDataReader reader = cmd.ExecuteReader()

cmdExecuteReader 返回一个具有内存值的对象。阅读器是界面。如何将对象分配给接口?接口不只是一个内部没有方法定义的合同吗?

4

3 回答 3

10

ExecuteReader不返回对象- 它返回对某种类型的对象的引用IDataReader,该对象实现(或 null,当然)。

这个想法是调用者/客户端不需要知道实现类,只需知道它实现了接口。当客户端调用诸如 的方法时reader.Next(),该方法将使用基于的值所引用的对象的执行时类型的实现。reader

将引用值分配给变量不会更改该引用所引用的对象的类型。例如:

string text = "hello";
object o = text;

现在otext具有相同的值 - 对相同字符串的引用。如果你打电话:

Type t = o.GetType();

仍然会返回对Type表示 的对象的引用System.String,因为 的值o引用了一个String对象;访问对象的变量类型不会改变对象的执行时类型。

于 2011-05-26T11:06:09.450 回答
1

虽然不能实例化接口,但可以实例化实现接口的对象。然后可以通过接口类型引用该对象。这就是上面的代码正在做的事情。

于 2011-05-26T11:06:45.677 回答
0

cmd.ExecuteReader()不创建和返回IDataReader实例;它返回一个恰好实现的对象IDataReader(也可能实现任意数量的其他接口)。因此,您可以为声明为接口类型的变量或字段赋值,但不能创建接口类型的实例。

于 2011-05-26T11:07:01.737 回答