接口是我们常用来处理对象之间共有特性的工具。使用接口,我们可以将一些无继承关系的对象联系起来,得到其共有的特性和行为。这也成为一种设计模式“适配器”(Adapter)的核心思想。
今天需要和大家分享的是一种动态接口的创新。刚才我们了解到,用接口实现了对共有某些特性的对象之间实现了连接,但有些对象,如派生于远古祖先的两个对象(如从 object 派生的 System.Windows.Forms.Control 和 System.Web.Security.WindowsIdentity),表面上看起来他们具备相当的无关性,但他们却仍然具备某些共同的地方,如上述两个对象,他们一个用来描述用户界面中的元,既控件,一个用来表示 Web 应用程序中基于 Windows 身份验证的用户设别信息,表面上他们是无关的,但可以发现,他们都具备一个共同特性,即 Name。如用接口来描述这个特性,就显得有些勉强。另外,某些基于动态语言运行时返回的数据类型,也存在这种情况,如何在这些无关性较大的对象之间建立起联系呢?
动态接口(Dynamic Interface)可以解决这些问题,他可以将对象在运行时转化为接口类型,然后对这个类型实例进行操作。它能够使得原本没有实现接口的两个或者多个对象“动态的”用接口联系起来。这正如扩展方法(Extension Methods)的思想一样。动态接口也被称为“鸭子类型”(Duck Type),是动态语言运行时的重要内容。
Visual Basic 10 将提供对动态接口的支持,对于以上两个对象,下面的代码可以对它们进行连接。
- Dynamic Interface IName
- Public Property Name As String
- End Interface
- Public Sub Test()
- Dim c As Control = GetControl()
- Dim user As IIdentity = GetUser()
- IName name = c
- name.Name = "Hello!"
- name = user
- MessageBox.Show(name.Name)
- End Sub