4

IDictionary 接口需要什么。如何初始化 IDictionary 接口。毕竟它只是一个界面。以下代码片段来自 msdn。我无法理解。

IDictionary<string, string> openWith = new Dictionary<string, string>();
4

5 回答 5

11

它定义了 Dictionary 应该实现的重要功能。

MSDN 中的这行表示您正在创建一个对象openWith ,该对象实现了IDictionary接口中定义的功能(方法) 。

当您使用 Dictionary 声明变量时,例如:

Dictionary<string,string> openWith=.....;

您与对象的具体类型绑定。但是当你使用

IDictionary<string,string> openWith=....;

您可以将它与任何实现IDictionary 接口的对象一起使用,也许是您自己的自定义类:)

于 2009-05-22T06:42:08.287 回答
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 兼容的数据提供程序。

于 2009-05-22T06:44:11.700 回答
5

它与任何其他界面没有什么不同。尝试考虑一个更简单的示例:

interface IThermometer
{
    double CurrentTemperature { get; }
}

现在我们有了获得温度的方法,尽管我们并不关心它是如何测量的。我们可以创建各种实现:

class MercuryThermometer : IThermometer
{
    public double CurrentTemperature
    {
        get { return ... /* gets the temperature somehow */ }
    }
}

程序的其余部分不需要知道它使用的是哪个温度计。

于 2009-05-22T06:46:32.227 回答
1

我怀疑您只是忽略了类型为IDictionary<,>(接口)的变量与初始化为 a 的值(引用)之间的区别Dictionary<,>(注意 no I;具体类型)。

于 2009-05-22T07:46:48.237 回答
1

它对于单元测试也很有用。您可以为接受 IDictionary 而不是 Dictionary 并传递模拟的方法编写单元测试。如果它要接受一个类实例(也可以是密封的),你会有点搞砸了(你必须使用适配器模式等等)。

于 2009-05-22T09:41:03.123 回答