IDictionary接口的用途是什么? IDictionary接口如何初始化?毕竟它只是一个界面。以下代码片段来自msdn。我无法理解它。IDictionary接口的用途
IDictionary<string, string> openWith = new Dictionary<string, string>();
IDictionary接口的用途是什么? IDictionary接口如何初始化?毕竟它只是一个界面。以下代码片段来自msdn。我无法理解它。IDictionary接口的用途
IDictionary<string, string> openWith = new Dictionary<string, string>();
它定义了字典应该实现的重要functions。
从MSDN线意味着你创建对象openWith它实现在IDictionary的接口中定义的功能(方法)。
当使用字典声明变量,如:
Dictionary<string,string> openWith=.....;
你是绑定与混凝土类型的对象。但是,当你使用
IDictionary<string,string> openWith=....;
你可以实现IDictionary的接口任何对象使用它,也许你自己的自定义类:)
接口的全部意义在于提供好... ,这是一个到任何模块的接口(我在这里广义使用“模块”),以便调用代码不必担心如何实现这个特定的接口。
至于“IDictionary
接口如何初始化”,这在技术上是不正确的。可以初始化的是一个变量,其类型为IDictionary<T, V>
。确保变量必须被初始化,但通常隐藏在“客户端代码”中。然而,
IDictionary
不是很有代表性。相反,考虑一个IDataReader
接口。你一定处理ADO.NET,所以这应该很熟悉:
public Foo PopulateFromDataReader(SqlDataReader dataReader)
这种特殊的方法是紧耦合的SqlDataReader
,所以你不得不重写它为它的支持,比方说,访问或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 */ }
}
}
程序的其余部分不需要知道它使用的是哪种温度计。
+1这个例子... – 2012-07-26 13:44:40
我怀疑你只是忽略类型为IDictionary<,>
(接口)变量之间的差异,并初始化为Dictionary<,>
值(参考)(注意没有I
;具体类型)。
它对单元测试也很有用。你可以为接受IDictionary而不是Dictionary的方法编写单元测试,并传递一个模拟。如果它接受一个类实例(它也可以被封装),那么你会被搞砸了(你必须使用适配器模式等等)。
+1非常好的例子.. :)你清除了让我迷惑的差异...很好的例子。 – 2012-07-26 13:47:27