用 C 語言寫面向的物件是一種什麼樣的體驗

發表於2017-03-05

最近從老東家離職,跳出來跟這幾個以前的老同事,拉了一個創業團隊,準備幹一票,去之前也瞭解了一番,此次將使用C語言來開發,對於畢業之後一直從事C++物件導向思維編碼的我來說,雖然不捨,但是仔細想了下,這都不是事,誰說用C語言寫不了物件導向?

眾所周知物件導向的三個特性:封裝性、繼承性、多型性。這幾個特性的具體含義我等會會班門弄斧講一下含義,下面,請允許我先用C++物件導向思維將設計模式中最常用的簡單工廠模式寫一邊,相信這三個特性不言而喻。

以下我將用一個工廠類實現具體汽車的生產,賓士車、寶馬車、奧迪車都將通過工廠類來生產,由父類指標指向具體的汽車例項:

標頭檔案:

原始碼:

以上便是簡單工廠模式的原始碼示例,現在,我們來聊聊為什麼用C語言我們也可以實現這物件導向思維的三大特性:

首先是封裝性:C++的封裝性就是將抽象類的函式和屬性都封裝起來,不對外開放,外部要使用這些屬性和方法都必須通過一個具體例項物件去訪問這些方法和屬性,而我們知道,C語言中一旦包含了標頭檔案便可以使用標頭檔案中的函式和變數,其實C語言中也可以用一種方法達到這種效果,那便是使用結構體+函式指標+static,結構體中定義屬性和函式指標,static將方法都限制在本模組使用,對外部,通過指標函式的方式訪問,如此一來,便可以達到物件導向封裝性的實現;

對於繼承性:C++ 物件導向的繼承是可以繼承父類的屬性和方法,在子類物件中的記憶體中是有父類物件的記憶體的,那麼,用C語言來寫的話我們完全可以在父類結構體中定義一個父類變數在其中,在使用構造子類的時候同時構造父類,便可以達到繼承性的特性;

對於多型性:C++中允許一個父類指標指向子類實體,在這個指標使用方法時,若此方法是虛擬函式,則執行動作會執行到具體的子類函式中,本質的實現方式是通過一個虛擬函式指標的方式,由於我們用C語言寫物件導向本就是通過函式指標的方式來封裝函式,那我們完全可以將結構體父類的變數的函式指標讓他指向子類的函式來達到多型的特性。

好了,在你們面前班門弄斧了一番,下面開始具體的程式碼實現:

標頭檔案:

原始檔:

測試檔案main.cpp

編譯後執行:


以上的結果可以看出,我們的測試程式碼介面都是一樣的,效果達到了C++物件導向的設計理念,用C語言完成了一次狠狠的逆襲,希望讀者朋友在你的專案工程中有幫助。其實程式設計師的工作大部分是寫程式碼,但是程式碼的閱讀物件往往並不是我們自己,將我們的思維寫進去才是一個程式設計師的境界,不要簡單的根據流程去寫一個程式碼,否則,程式設計師就真的只是一個工具了;

哦,BTW,在函式中我使用了本結構體的指標在裡面,是為了達到在函式中使用示例的屬性,這樣就獨立每一個示例的屬性操作了。

相關文章