我正在学习 Microsoft .NET 框架,不太理解控件和组件之间的差别。我知道这些术语可以互用,但什么时候从
Control 派生,什么时候从 Component 派生呢?
Linda Berno
好问题!简单说来,控件就是具有用户界面的组件。要说的具体一点,就得回顾早期 Windows 的历史根源,当时控件
指任何子窗口——按钮、列表框、编辑框或者某个对话框中的静态文本。从概念上讲,这些窗口——控件——类似用来操作收
音机或小电器的旋钮和按钮。随着控件数量的增加(组合框、日期时间控件等等),控件逐渐成为子窗口的代名词,无论是用
在对话框中还是用在其它种类的主窗口中。没过多久 BASIC 程序员开始编写他们自己专用的控件,自然而然地人们便想到共
享这些控件。共享代码的方法之一是通过磁盘拷贝,但那样显然效率低下。必须要有一种机制使开发者建立的控件能够在其它
程序员的应用中轻而易举地插入,这便是 VBA 控件,OLE 控件,OCX 和最后 ActiveX 控件的动机。
这就是控件和组件之间产生混淆之所在。因为为了解决控件的可复用问题,所有这些技术必须首先解决更为一般的组件重
用问题。(COM,如果你还记得它的话,意思是组件对象模型)。在软件行话中,组件这个术语指任何可复用的对象或任何可
与其它对象交互的代码体。子程序的发明,曾经一度成为程序员趋之若鹜的软件工程圣杯:一种统一的编程理论,它使程序员
从基本构建块——也就是用所选语言编写的各种组件建立大型系统。从子程序演变到 OOP,到 DLLs,再到 COM,再到.NET
框架的每一种新的编程范例都代表了一种不同的提供可重用性的方案。VBX 使用 DLLs 的固化名称。COM 使用接口和
IUnknown。.NET 框架使用微软的中间语言(MSIL)层和公共语言运行时(CLR)来提供统一的粘合。
因此,控件是组件的一个主要样本(并且历史上曾驱动着组件的开发),控件又不仅仅是唯一的一种组件。组件不需要显示任
何信息或用户界面。组件可能实现科学计算,收集性能数据,计算 1971 年 1 月 1 日到现在的毫秒数,仰或是读取布什总统竞
选活动保险箱里的美金数。Figure 4 显示了 Visual Studio .NET 中的非控件组件例子。
Figure 4 组件
在 .NET 框架中,术语控件和组件为 .NET 赋予了专门的意义。Component 类为被用于设计层面的对象如 Windows
Forms Designer (Windows 窗体设计器)或 Web Forms Designer (Web 窗体设计器)提供了基本实现。某个
Component 是任何可以被拽到某个窗体的任何东西。Component 类实现 IComponent,ISite 和 IContainer。这些接
口比起其来自 OLE 时期的 COM 堂兄弟要简单得多。 IContainer 比起带有 Add/Remove 方法的组件列表以及组件属性来
要稍微复杂一点,它获得的组件是一个 ComponentCollection (组件集合)。
IComponent 从 IDisposable 派生而来,并且只有一个属性,Site,获取组件的 ISite 接口。Component 可能有,也可