我正在學習 Microsoft .NET 框架,不太理解控件和組件之間的差別。我知道這些術語可以互用,但什么時候從 Control 派生,什么時候從 Component 派生呢?
好問題!簡單說來,控件就是具有用戶界面的組件。要說的具體一點,就得回顧早期 Windows 的歷史根源,當時控件指任何子窗口——按鈕、列表框、編輯框或者某個對話框中的靜態(tài)文本。從概念上講,這些窗口——控件——類似用來操作收音機或小電器的旋鈕和按鈕。隨著控件數量的增加(組合框、日期時間控件等等),控件逐漸成為子窗口的代名詞,無論是用在對話框中還是用在其它種類的主窗口中。沒過多久 BASIC 程序員開始編寫他們自己專用的控件,自然而然地人們便想到共享這些控件。共享代碼的方法之一是通過磁盤拷貝,但那樣顯然效率低下。必須要有一種機制使開發(fā)者建立的控件能夠在其它程序員的應用中輕而易舉地插入,這便是VBA控件,OLE控件,OCX和最后ActiveX 控件的動機。
這就是控件和組件之間產生混淆之所在。因為為了解決控件的可復用問題,所有這些技術必須首先解決更為一般的組件重用問題。(COM,如果你還記得它的話,意思是組件對象模型)。在軟件行話中,組件這個術語指任何可復用的對象或任何可與其它對象交互的代碼體。子程序的發(fā)明,曾經一度成為程序員趨之若鶩的軟件工程圣杯:一種統一的編程理論,它使程序員從基本構建塊——也就是用所選語言編寫的各種組件建立大型系統。從子程序演變到OOP,到DLLs,再到COM,再到.NET框架的每一種新的編程范例都代表了一種不同的提供可重用性的方案。VBX使用DLLs的固化名稱。COM使用接口和IUnknown。.NET框架使用的中間語言(MSIL)層和公共語言運行時(CLR)來提供統一的粘合。
因此,控件是組件的一個主要樣本(并且歷曾驅動著組件的開發(fā)),控件又不僅僅是的一種組件。組件不需要顯示任何信息或用戶界面。組件可能實現科學計算,收集性能數據,計算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 (組件集合)。
好問題!簡單說來,控件就是具有用戶界面的組件。要說的具體一點,就得回顧早期 Windows 的歷史根源,當時控件指任何子窗口——按鈕、列表框、編輯框或者某個對話框中的靜態(tài)文本。從概念上講,這些窗口——控件——類似用來操作收音機或小電器的旋鈕和按鈕。隨著控件數量的增加(組合框、日期時間控件等等),控件逐漸成為子窗口的代名詞,無論是用在對話框中還是用在其它種類的主窗口中。沒過多久 BASIC 程序員開始編寫他們自己專用的控件,自然而然地人們便想到共享這些控件。共享代碼的方法之一是通過磁盤拷貝,但那樣顯然效率低下。必須要有一種機制使開發(fā)者建立的控件能夠在其它程序員的應用中輕而易舉地插入,這便是VBA控件,OLE控件,OCX和最后ActiveX 控件的動機。
這就是控件和組件之間產生混淆之所在。因為為了解決控件的可復用問題,所有這些技術必須首先解決更為一般的組件重用問題。(COM,如果你還記得它的話,意思是組件對象模型)。在軟件行話中,組件這個術語指任何可復用的對象或任何可與其它對象交互的代碼體。子程序的發(fā)明,曾經一度成為程序員趨之若鶩的軟件工程圣杯:一種統一的編程理論,它使程序員從基本構建塊——也就是用所選語言編寫的各種組件建立大型系統。從子程序演變到OOP,到DLLs,再到COM,再到.NET框架的每一種新的編程范例都代表了一種不同的提供可重用性的方案。VBX使用DLLs的固化名稱。COM使用接口和IUnknown。.NET框架使用的中間語言(MSIL)層和公共語言運行時(CLR)來提供統一的粘合。
因此,控件是組件的一個主要樣本(并且歷曾驅動著組件的開發(fā)),控件又不僅僅是的一種組件。組件不需要顯示任何信息或用戶界面。組件可能實現科學計算,收集性能數據,計算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 (組件集合)。