IDictionary界面的需求是什么。如何初始化IDictionary接口。毕竟它只是一个界面。以下代码段来自msdn。我无法理解。
IDictionary<string, string> openWith = new Dictionary<string, string>();
答案 0 :(得分:11)
它定义了Dictionary应该实现的重要functions。
来自MSDN的行意味着您正在创建一个对象 openWith ,它实现了 IDictionary 接口中定义的函数(方法)。
当您使用Dictionary声明变量时:
Dictionary<string,string> openWith=.....;
您与具体类型的对象绑定。但是当你使用
时IDictionary<string,string> openWith=....;
您可以将它与任何实现 IDictionary 接口的对象一起使用,也许是您自己的自定义类:)
答案 1 :(得分:9)
接口的全部意义在于提供......以及任何模块的接口(我在广义上使用“模块”),这样调用代码就不必担心这个特定接口是如何实现的。
至于“如何初始化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兼容的数据提供程序。
答案 2 :(得分:5)
与任何其他界面没有什么不同。试着考虑一个更简单的例子:
interface IThermometer
{
double CurrentTemperature { get; }
}
现在我们有办法获得温度,但我们并不关心它的测量方式。我们可以创建各种实现:
class MercuryThermometer : IThermometer
{
public double CurrentTemperature
{
get { return ... /* gets the temperature somehow */ }
}
}
程序的其余部分不需要知道它正在使用哪个温度计。
答案 3 :(得分:1)
我怀疑你只是忽略了键入为IDictionary<,>
(界面)的变量与初始化为Dictionary<,>
的值(引用)之间的区别(注意没有I
;具体类型)。
答案 4 :(得分:1)
它对单元测试也很有用。您可以为接受IDictionary而不是Dictionary的方法编写单元测试并传递模拟。如果它接受一个类实例(也可能是密封的)你会有点搞砸(你必须使用适配器模式等)。