我可以用IDictionary做更多或更少的事情吗?这两个系列有何不同?
IDictionary只是一个接口 - 一个描述实现类必须执行的操作的契约.Dictionary是实现该接口的具体类,因此必须提供IDictionary接口中描述的方法.
如果你想创建一个字典,你必须创建一个具体的类(即字典),但如果你想用该字典做的只是IDictionary接口公开的方法,你可以将concreate类作为接口传递 - 这减少了耦合方法之间.
我想每个人都已经指出IDictionary(Of String, String)
的是,一个接口不能被实例化一个对象,并且Dictionary(Of String, String)
是一类可以被实例化一个对象.但是,重要的是要知道为什么你可以使用一个与另一个.
假设您要定义一种方法来搜索字典并返回与该键相关联的值; 如果找不到值,则需要返回一个emtpy字符串.你需要一本字典,所以你决定继续使用.NET的Dictionary
类来实现:
Function GetValueFromKey(ByVal dict As Dictionary(Of String, String),
ByVal key As String) As String
If ''//you find the value in the dictionary
return theValue
Else ''//you can't find the value in the ditionary
return String.Empty
End If
End Function
Run Code Online (Sandbox Code Playgroud)
您实现了代码,您的方法运行良好.但是,几个月后,您会注意到您的程序开始变慢.当您深入研究问题时,您会发现Dictionary
当您的关键数据长度为50,000个字符时,.NET的实现并不理想(注意:老实说,我不知道.NET的Dictionary
实现是否存在任何实际问题;这是只是一个例子),所有的密钥字符串长度超过50,000个字符.
所以现在你必须找到一种不使用.NET Dictionary
类的查找数据的新方法.您将不得不使用新的数据类型,然后在您的代码中的任何地方使用GetValueFromKey(...)
,您将不得不进行修改以使用新的数据类型.这不是世界末日,但也许有更好的方法.
当你第一次编写你的GetValueFromKey
方法时,你可能会想到"我需要从字典中检索一个值.无论它是什么类型的字典都无关紧要,但我需要从中获取它的价值." 在这种情况下,您可以选择使用如下IDictionary
界面:
Function GetValueFromKey(ByVal dict As IDictionary(Of String, String),
ByVal key As String) As String
If ''//you find the value in the dictionary
return theValue
Else ''//you can't find the value in the ditionary
return String.Empty
End If
End Function
Run Code Online (Sandbox Code Playgroud)
关于该功能的一切看起来都是一样的,除了Dictionary
改为IDictionary
?您的功能实现是否发生了变化?不. IDictionary
只是一个定义字典需要具有的属性和方法的契约.您所关心的所有功能都是调用字典的属性和方法.您的功能并不关心它是如何实现的.
通过这种方式,如果你已经编程到一个IDictionary
接口而不是一个Dictionary
实现,当你的程序放慢速度并且你被迫改变你的字典实现时,你可以简单地编写自己的字典类来实现IDictionary
.只要你的新类遵循规定的合同IDictionary
,没有你的其他代码需要改变,以应对您所创建的新字典类.
设计原则"程序到界面而不是实现"可以帮助您处理变更.如果您开始学习如何在代码中使用接口,那么您将更好地准备应对更改.
归档时间: |
|
查看次数: |
6047 次 |
最近记录: |