c語言如何實現面向對象功能?
如,有10個類,就對應10個.c文件,每個類的方法寫在對應的.c文件里,可行嗎?
奇技淫巧很多,但基本不推薦鋪開用。
試舉幾例,當靶子打:
1. Glib風格。能用,然而轉型過多,繼承繁瑣,指針滿天飛容易鼓勵內存碎片(不一定需要在意,但也不該完全不在意)。
2. 侵入式介面。struct里給出函數指針,實現單元包含介面struct,構造時注入方法實現到函數指針成員。可以做類繼承,也可以簡單模擬原型繼承。
不知道怎麼實現的可以參考linux鏈表的container_of,有這個就可以了。
缺點之一是類型混亂。碎片有所降低,但方法內聯幾乎不可能(全都虛掉了,編譯時可能很保守處理)。實際上未必需要這麼動態的派發,所以有點尷尬。
3. 你能造出的各種其他宏把戲。
Emmm 合式不難,好看不容易,換人維護都是坑……
說到底,上面說的也不是本格OOP。究竟怎麼定性OO,決定了是否需要動真格去模擬某些特性。
對於絕大部分 OOP需求(輕量級),你的方法已經夠用了。
若想更深入一步,不妨翻翻這本書:
《Object-Oriented Programming With ANSI-C》
手把手教你搭一個 偽OOP。書中有不少奇技淫巧,讀來挺有意思的。
(這書網上資源挺多,就不啰嗦了...)
-----------------------
再一則,可以關注下面這本書:
《深度探索 C++對象模型》
(-- 不熟悉C++語法也沒事 --)
此書描述了 C++ 中的 class 是怎麼用底層語法實現的(無非就是 C 中的 struct, 函數指針,數組 這些元件)很有啟發性和引導意義。
如果你很懶,可以直接去網上搜此書的學習筆記 來讀。至少,我是通過這本書入門 對象模型 這個領域的。
你是否把每個數據的操縱函數分著寫在單獨的.c文件里,和是不是面向對象,沒有任何關係。面向對象的關鍵,是圍繞著數據來劃分函數。
你可以看看GNU的Cairo庫,純C寫的,完全面向對象。
模擬出一個不完全的面向對象風格肯定是可行的(主要是語法糖部分,比如說public private 之類的訪問許可權無法實現)。C++早期(C with class時期)的編譯器Cfront就是先編譯出C源代碼,然後再用C編譯器編譯。用C實現面向對象風格的話就得把C++編譯器幫你生成的東西手動寫一遍了(比如說構造和析構,創建虛表,生成虛表指針等)。而且很多C的項目也早就運用面向對象了,比如說Linux內核,裡面就有很多地方運用了oop。
GObject 了解下
推薦閱讀: