【发布时间】:2011-05-26 11:03:47
【问题描述】:
我有一个问题。接口没有任何定义。接口无法实例化。这段代码怎么可能有效?
IDataReader reader = cmd.ExecuteReader()
cmdExecuteReader 返回一个具有内存值的对象。阅读器是界面。如何将对象分配给接口?接口不只是一个内部没有方法定义的合同吗?
【问题讨论】:
标签: c# variable-assignment idatareader
我有一个问题。接口没有任何定义。接口无法实例化。这段代码怎么可能有效?
IDataReader reader = cmd.ExecuteReader()
cmdExecuteReader 返回一个具有内存值的对象。阅读器是界面。如何将对象分配给接口?接口不只是一个内部没有方法定义的合同吗?
【问题讨论】:
标签: c# variable-assignment idatareader
ExecuteReader 不返回 object - 它返回对实现 IDataReader(或 null,当然)的某种类型的对象的 reference。
这个想法是调用者/客户端不需要知道实现类,只需知道它实现了接口。当客户端调用reader.Next()等方法时,将使用基于reader的值所引用的对象的执行时间类型的实现。
将引用值分配给变量不会更改该引用所引用的对象的类型。例如:
string text = "hello";
object o = text;
现在o 和text 具有相同的值 - 对相同字符串的引用。如果你打电话:
Type t = o.GetType();
这仍将返回对代表System.String 的Type 对象的引用,因为o 的值引用了String 对象;访问对象的变量类型不会改变对象的执行时类型。
【讨论】:
虽然您无法实例化接口,但您可以实例化实现该接口的对象。然后可以通过接口类型引用该对象。这就是上面的代码所做的。
【讨论】:
cmd.ExecuteReader() 不会创建并返回IDataReader 实例;它返回一个恰好实现IDataReader 的对象(并且它也可能实现任意数量的其他接口)。因此,您可以为声明为接口类型的变量或字段赋值,但不能创建接口类型的实例。
【讨论】: