根据我的理解界面,这些只是协议,没有任何实现。
我正在尝试理解以下代码:
此代码有效
Exception ex = new Exception();
ex.Data.Add("1", "One");
因为Data
是ListDictioaryInternal
类型的属性(如智力所示),它实现了IDictionary
。
但是,如果右键单击Data
并转到定义,则会看到该定义为:
public virtual IDictionary Data { get; }
为什么Data
没有定义为ListDictioaryInternal
?
答案 0 :(得分:4)
Exception
类定义属性Data
,其类型为IDictionary
。这意味着实现该接口的任何对象都可以由getter返回。实际上,如果深入研究定义,您将在注释中看到这一点:
// Summary:
// Gets a collection of key/value pairs that provide additional user-defined information
// about the exception.
//
// Returns:
// An object that implements the System.Collections.IDictionary interface and contains
// a collection of user-defined key/value pairs. The default is an empty collection.
public virtual IDictionary Data { get; }
该类的内部实现似乎使用System.Collections.ListDictionaryInternal
作为实际使用的对象。如果您查看该类的源代码,则会发现它实现了相关的接口:
internal class ListDictionaryInternal: IDictionary
{
//...
}
因此,接口表示对象可以做什么的契约。返回的实际对象是实现该接口的具体类。
答案 1 :(得分:3)
由于ListDictionaryInternal实现了IDictionary
,因此IDictionary
的使用符合abstraction。