IDictionary接口的目的是什么?

5

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

IDictionary<string, string> openWith = new Dictionary<string, string>();
5个回答

12

它定义了一个字典应该实现的重要函数

MSDN上的那行代码意味着你正在创建一个对象openWith,它实现了IDictionary接口中定义的函数(方法)。

当你使用Dictionary来声明变量时:

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

你被绑定在具体类型的对象上。但是当你使用

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

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


10
整个接口的目的是提供一个接口给任何模块(我在这里使用“模块”来表示广义),以便调用代码不必担心如何实现特定接口。
至于“如何初始化IDictionary接口”,这在技术上并不正确。可以初始化的是变量,其类型为IDictionary。当然,变量必须被初始化,但通常这对“客户端代码”来说是隐藏的。
IDictionary并不是很具有代表性。相反,考虑一个IDataReader接口。你肯定处理过ADO.NET,所以这应该很熟悉:
public Foo PopulateFromDataReader(SqlDataReader dataReader)

这种方法与SqlDataReader紧密耦合,所以如果想要支持Access、Oracle或MySQL,你需要重新编写它。换句话说,你依赖于具体实现。
现在考虑一下:
public Foo PopulateFromDataReader(IDataReader dataReader)

这种方法可以与任何实现了 IDataReader 接口的类一起使用,也就是说基本上可以与任何兼容 ADO.NET 的数据提供程序一起使用。


非常好的例子.. :) 你解决了让我困惑的问题... 很棒的例子。 - Mayank Pathak

6
这与任何其他界面没有区别。试着想一个更简单的例子:
interface IThermometer
{
    double CurrentTemperature { get; }
}

现在我们有一种获取温度的方法,虽然我们不关心它是如何被测量的。我们可以创建各种实现:

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

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


2

我猜你可能忽视了变量类型为 IDictionary<,>(接口)和初始化值为 Dictionary<,>(注意没有 I,是具体的类型)之间的区别。


2

这对于单元测试也非常有用。你可以为一个接受IDictionary而不是Dictionary的方法编写一个单元测试,并传递一个模拟对象。如果它接受一个类实例(也可以是密封的),那么你会有一些麻烦(需要使用适配器模式等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接