類層次(class hierarchy)是一些通過繼承(inheritance)相關聯的類的集合。它的一些常見類類型有:
*抽象基類;
*具體類;
*節點類;
*接口類;
*容器和集合類;
*應用框架類;
*域類。
1. 抽象基類
抽象基類為所有后代提供藍圖,它作為從它派生的所有類的一套原則和接口策略。為了使用抽象類,用戶必須首先從基類派生出一個新類,并為抽象類中聲明的所有純虛函數提供實際的定義。抽象類在C++語言結構中的身份是純虛函數,對于一個抽象類,它必須至少有一個純虛函數。
2. 具體類
具體類作為純結類來設計和實現。它表示祖先-后代世系中的結束。它沒有虛函數,不打算用來被繼承,只是按現在的樣子進行直接使用。
2.1 節點類:
它提供繼承和多態的基礎。與抽象基類一樣,節點類設計用于被繼承,但它不包含純虛函數。節點類可以立即使用,不過節點類的設計還同時著眼于未來,它的設計具有可重用性,同時提供可以在派生類中覆蓋的虛成員函數。它還提供可以被派生類繼承的受保護數據成員和成員函數。它使用基類的指針和引用使得可以操縱后代類中的成員函數。
2.2 線程與容器和集合類
與大部分C++組件類型一樣,在多線程程序中,集合和容器類與線程交互的主要途徑有兩種:
*線程間通信;
*多線程服務器。
與一般情況下將數據結構用作多個進程間通信機制相比,使用面向對象組件進行線程間通信具有巨大的優點。進程間的數據通信通常位于線性數據結構中,例如隊列和管道中。這些數據結構沒有提供圖表、集和映射所提供的表達力。當在進程間傳遞數據時,程序員被迫將通信看作多個進程間的一種簡單線性數據或消息交換。
多線程類的簡單架構:
為了設計多線程類,我們至少需要6個基本組件:
a.宿主類(host class);
b.線程類(thread class);
c.互斥和事件類(mutex and event class);
d.友元成員函數(friend member function);
e.域類(domain class);
f.強制轉換基本元素(casting primitive)。
宿主類是用戶與之交互的類。有兩種常用的多線程宿主類。第一種類型是多線程應用程序框架;第二種類型是多線程服務器。宿主類被分解成兩個或更多的線程,每個線程執行宿主類的一個友元函數。當執行友元函數時,宿主類將this指針作為一個參數傳遞給該線程。this指針在友元函數中被強制轉換成指向適當類型的類。this指針形成了宿主類與位于另一個線程中的域類間的線程間通信。每個友元函數將創建一個或多個域對象來完成線程的請求。
2.3 應用框架類
在所有能夠以軟件重用為目標構建的面向對象組件中,也許面向對象應用框架最難以構建,但一旦構建后卻能提供最大好處的組件。與容器類、集合類以及類型的類層次相比,應用框架一般情況下是最易于理解的面向對象類層次。但它又是最難以構建的類層類,因為它們為思想建模。也就是說,應用框架為對象交互、工作模式、動作序列、軟件事務以及進程內容來建模。
應用框架為一般性面向對象應用。這個框架以類層次的形式捕獲應用具有的動作、工作模式和處理內容的序列。它用作整個應用的模式,具體化應用具有的基礎結構或骨架,而沒有提供應用的細節。它指定了面向對象架構中軟件部分間的關系、責任和協議。
應用框架的目標是成功一般化工作模式。應用框架的設計需要對軟件分解有一個全面的理解,因為設計者必須將框架分解成提供者實現和客戶實現部分。在多線程應用框架中,框架執行的工作模式必須分解成一套線程。框架的實質是需要分解成它的一般性部分以及特定應用的部分。
應用框架由相關類的集合組成。它的成員函數有一個預設計的、內置的交互模式這套相關類和預設計交互模式為程序員提供一些一般性問題的特定解決方案。
應用框架總是至少分解為兩個主要組件。第一個組件為框架設計者提供的框架部分。這個組件包含按一般性方式捕獲的特定動作序列以及對象間的關系,它表示某問題類別的一種常用解決方案。第二個組件稱做ensemble,它具體表現域知識、專家知識、規則以及特定解決方案的策略。ensemble由框架的用戶提供,而框架本身提供了應用的形式,ensemble提供應用的具體內容。