物件導向的設計主要是看怎麼組織自己的類。
composite是個容器,他既可以放composite也可以放primitive,所以vector中的型別是兩個的父類。同時他就得包含乙個add方法,可以新增composite或primitive。這種結構要解決的問題的解法就是叫做component設計模式。primitive想到那個於乙個檔案composite相當於目錄,目錄中可以包含目錄和檔案,檔案沒有add的方法,所以父類中的add不能是純虛函式。
問題:做乙個框架,樹型結構,未來可以新增子類,不知道未來的class名稱。
解決方法:
子類自己建立自己。子類中有乙個靜態的自己;
子類的建構函式是私有的,裡面呼叫父類的addprototye方法,將自己的指標新增到父類存放的子類的變數池中,將自己掛到父類上。
clone建立乙個子類自己,父類通過clone來呼叫子類,讓框架端可以看到自己。
思想:將建立的權利給子類,讓子類自己可以建立,只要子類建立的物件可以被父類知道即可。
下面兩個類landsatimage和spotimage是子類,上面的image是父類,兩個子類中各自有乙個靜態的自己的物件,這樣就建立了自己。要上面的父類可以看到建立的子類,上面準備了乙個空間image*,讓子類將自己放上去。
「#」是protected的。建構函式是私有的,可以呼叫靜態的私有物件,同時構造函式呼叫addprototype函式,將自己掛到父類上去。
clone用來建立一自己,上面父類就可以通過原型呼叫clone建立乙個子類。如果沒有原型就不能通過物件呼叫clone。
如果clone是靜態也可以被上面的父類呼叫,但是靜態函式的呼叫必須要有class name,而未來是不知道class name的。
為什麼有兩個建構函式:第乙個建構函式是把自己掛到父類上的。第二個建構函式是給下面的clone裡的new來使用的,避免遞迴。加了乙個引數,但其實這個引數沒有用到,因為這裡的所有建構函式都是不對外的,所以不能是public,用private也可以。所以clone中new的時候是傳入了乙個數。
來自書籍《design pattern ****** 》**上包含源**。
侯捷C 筆記
1.如果是類中唯讀函式後面沒有加上const,這樣如果變數定義成const,而函式沒寫成const,這樣編譯期會困惑。2.相同class的各個物件objects互為友元。3.建構函式初始化用 比 裡面初始化效率更高。4.函式返回值寫成void時,應該考慮鏈式賦值,如果是void就行不通了。5.拷貝賦...
侯捷 C 標準11 14
本篇記錄學習 侯捷 c 標準11 14 一 演進 環境與資源 1 c 2.0的新特性,包括語言的部分和標準庫的部分。tr1是2003年的版本,即c 1.0。二 variadic templates 1 數量不定的模板引數,引數個數和引數型別都未定。三 spaces in template expre...
侯捷c 物件導向(上)
一 c 程式設計簡介 1 基於物件 只有乙個class的程式設計 object based 物件導向 幾個class的程式設計 object oriented 2 class的經典分類 class without pointer members e.g complex 複數 class with p...