天天看點

C面向對象程式設計其他

C語言面向對象程式設計

1. 定義一個SuperObject結構體, 裡面包含最少的元素, 但是确實每一個對象都含有的, 這樣可以實作多态
    2. 每一個對象都是基于類的, 我們知道類都是單例對象, 是以我們建立結構體, TypeObject(類似于Java中的class), 接着每一個Object結構體中
都包含着一個對應類型的TypeObject指針, 比如"Hello world"這一個字元串對象所對應的結構體中有一個StrTypeObject示例, 這個StrTypeObject
是由我們定義的TypeObject結構體建立的, 當然萬物皆為對象, 是以還有MegaTypeObject作為TypeObject結構體的執行個體
    3. 注意: 在所有的Object結構體中, 都要SuperObject中所定義的所有的資料(主要是refcount, type_ptr(指向對應的class對象, 這裡就是一
個單例的, 是以方法就是在這裡的, static修飾的東西也都在這裡, 多态的實作也是在這裡, 因為多态主要是為要用方法服務的)), 内置的對象都是靜态的
    4. 使用者定義的類, 則是需要動态通過TypeObject這個結構體建立出來的, 使用者所定義的方法也要在該TypeObject中儲存起來, 用于以後的調用, 其實
在Java中至于對象有關的屬性, 在這裡原來的SuperObject因為包含的元素太少了不能滿足我們的需求, 我們需要在定義一個含有一個dict的BasicSuperO
bject結構體, 通過一個dict, 以"屬性名":屬性名值的形式來實作對每一個對象的屬性儲存, 而方法則在TypeObject中的dict中, 也通過類似的方法存儲
    5. 通過以上的幾點我們知道, 在TypeObject中定義方法和屬性, 對應于Java中的static修飾的函數和屬性, 都是與class有關, 與instance無關的,
而在BasicObject中定義的則是至于instance有關的
    
    6. 在TypeObject中需要内置一些方法, 讓每一個對象都有對應的處理操作, 實作繼承
            可以:
                1. 數值處理的函數的結構體
                2. 序列處理的函數的結構體
                3. 映射處理的函數的結構體
            則系統每一種内置對象分别填充對應的結構體函數指針, 并也在dict中存儲, 這樣在調用時就可以統一的調用了
    7. 為了有個性
        #define BUXAPI(return_type)  return_type
        BUXAPI(SuperObject *) so_dome();
        這樣就告訴使用者這是我們自己的API, 你們可以調用
    8. 需要内置的對象:
            int, float, string, mapping(命名空間中非常重要), list, stack, type
    9. 目錄結構:
            Include, Objects, Tools, Doc, Demo, Lib, Module
            
    10. 在面向對象中, 對象之間的操作符, 應該都轉為函數的操作
    11. 在Map中比較中應該調用每一個對象的equal方法, 如果類型不同則為false, 相同則比較真正比較的值, 傳回一個内置的None對象
    12. 遇到變量的重複定義, 使用extern關鍵字, 這個時候可以使用一個宏定義#define JCAPI_DATA(datatype) extern datatype 使得表達更加的直覺            

其他

1. 在C語言中定義了一個全局變量, 如果要直接為該全局進行指派, 那麼必須要賦常量值:0, NULL, "string", 如果要賦變量的值, 需要在函數中指派
2. 雖然這裡講的是面向對象的程式設計但是我在這裡寫的是一些技巧的東西

    如果有多個函數都結構相同的參數清單, 并且特别的長, 我們可以使用struct封裝參數清單, 這樣函數的參數清單就會簡明一些, 為了友善構造結構體, 我們可以通過一個宏或者函數來建立該結構體
    
3. C語言中要想實作foreach, 可以說使用宏定義
    
    #define for_each(s) \
        List *tmp = s.lists;
        
    調用時
        for_each() {
            ...code...
        }