IDictionary 接口需要什么。如何初始化 IDictionary 接口。毕竟它只是一个界面。以下代码片段来自 msdn。我无法理解。
IDictionary<string, string> openWith = new Dictionary<string, string>();
IDictionary 接口需要什么。如何初始化 IDictionary 接口。毕竟它只是一个界面。以下代码片段来自 msdn。我无法理解。
IDictionary<string, string> openWith = new Dictionary<string, string>();
它定义了 Dictionary 应该实现的重要功能。
MSDN 中的这行表示您正在创建一个对象openWith ,该对象实现了IDictionary接口中定义的功能(方法) 。
当您使用 Dictionary 声明变量时,例如:
Dictionary<string,string> openWith=.....;
您与对象的具体类型绑定。但是当你使用
IDictionary<string,string> openWith=....;
您可以将它与任何实现IDictionary 接口的对象一起使用,也许是您自己的自定义类:)
接口的全部意义在于提供......好吧,任何模块的接口(我在这里使用广义上的“模块”),以便调用代码不必担心这个特定接口是如何实现的。
至于“如何IDictionary
初始化接口”,这在技术上是不正确的。可以初始化的是一个变量,它的类型是IDictionary<T, V>
. 确实需要初始化变量,但这通常对“客户端代码”是隐藏的。
IDictionary
不过也不是很有代表性。相反,考虑一个IDataReader
接口。您肯定已经处理过 ADO.NET,所以这看起来应该很熟悉:
public Foo PopulateFromDataReader(SqlDataReader dataReader)
这种特殊的方法与 紧密耦合SqlDataReader
,因此您必须对其进行重写以支持例如 Access 或 Oracle 或 MySQL 或 Firebird 或其他任何东西。换句话说,你依赖于实现。
现在考虑:
public Foo PopulateFromDataReader(IDataReader dataReader)
此方法可用于任何实现 的类IDataReader
,这意味着基本上任何与 ADO.NET 兼容的数据提供程序。
它与任何其他界面没有什么不同。尝试考虑一个更简单的示例:
interface IThermometer
{
double CurrentTemperature { get; }
}
现在我们有了获得温度的方法,尽管我们并不关心它是如何测量的。我们可以创建各种实现:
class MercuryThermometer : IThermometer
{
public double CurrentTemperature
{
get { return ... /* gets the temperature somehow */ }
}
}
程序的其余部分不需要知道它使用的是哪个温度计。
我怀疑您只是忽略了类型为IDictionary<,>
(接口)的变量与初始化为 a 的值(引用)之间的区别Dictionary<,>
(注意 no I
;具体类型)。
它对于单元测试也很有用。您可以为接受 IDictionary 而不是 Dictionary 并传递模拟的方法编写单元测试。如果它要接受一个类实例(也可以是密封的),你会有点搞砸了(你必须使用适配器模式等等)。