C風格的面向對象編程

2020-12-08 閒聊代碼

面向對象編程(OOP),最早是C++、java等面向對象語言的一個核心特點,之後發展成了一種編程思想。

面向對象編程的主要特點是,把屬性(數據)與方法(函數)按照類型綁定,並按照類型之間的關係分層分模塊設計,通過基類指針虛函數實現多態

C++的OOP機制是最完善的,也是最複雜的。

java則在這個基礎上做了裁剪,並且屏蔽了對指針的直接處理,語法更簡化。

OOP隨著時間發展成了一種編程思想,也就不再受限於某幾種程式語言了。

C風格的面向對象編程,是隨著Linux系統的流行而逐漸流行起來的一種設計模式。最早,在Linux驅動工程師裡被廣泛使用。

C風格的面向對象編程,特點是:

1,用函數指針表示方法,

2,用結構體表示類,

3,用結構體的成員變量表示屬性,

4,用結構體之間的包含關係,表示類的繼承關係,

5,用open、create、alloc和close、release、free這類名字的函數來表示構造函數析構函數

一般是把所有方法的函數指針放在一個結構體裡,形成一個方法集來模擬虛函數表,並且給它起個字符串名字來表示該虛函數表關聯的子類

把不同子類的公共屬性作為結構體的成員變量,結構體本身就是基類

子類的特有成員變量則放在基類的void* data指針裡,具體內容由子類定義,並在子類的「構造函數」裡初始化。

代碼大概是這樣:

typedef struct socket_s socket_t;

typedef struct sockops_s sockops_t;

struct socket_s

{

int fd; //文件句柄

void* data; //子類屬性數據

sockops _t* ops; //子類虛函數表

};

struct sockops_s

{

char* name; // 子類的名字

int (*open)(socket_t* this); //構造

int (*close)(socket_t* this);//析構

int (*send)(socket_t* this);//send方法

int (*recv)(socket_t* this);//recv方法

};

C沒有new、delete關鍵字,需要給出兩個全局函數來代替。

int sock_open(socket_t** pthis, char* porto);

int sock_close(socket_t* this);

sock_open裡的二級指針用於返回創建的子類對象,字符串變量proto用來表示子類的網絡協議,例如tcp、udp、http、rtmp等等,其實就是子類的類型名字。

形參this,模擬的就是C++的this指針

受限於C的語法,this指針必須明確寫出來,而不是隱含著。也可以不叫this,C允許給形參起別的名字,例如context。

基類指針p調用子類對象的send方法時,就是:

p->ops->send();

通過「虛函數表」顯示調用。

p->ops在sock_open()時設置,而且之後不可以再修改。

C語言沒有機制阻止程式設計師修改p->ops的指向,只能作為約定。

在非初始化的代碼裡修改函數指針,是很不好的編程習慣。

因為一旦某個函數指針的值依賴代碼的執行路徑,而不只是初始化設置,那麼出了BUG之後就不容易確定函數指針指向的真正函數,查起來也就比較麻煩。

C沒有異常(exception),創建是否成功要看open()函數的返回值。

當然,沒有異常也就不存在構造函數拋出異常該怎麼辦這個問題。

可以在sock_open()返回之後直接用if判斷返回值就可以了。

相關焦點

  • C 語言面向對象編程 - 繼承
    上一篇文章主要講述了 C 語言面向對象編程
  • 一步步分析:C語言如何面向對象編程
    這篇文章,我們就來聊聊如何在C語言中利用面向對象的思想來編程。也許你在項目中用不到,但是也強烈建議你看一下,因為我之前在跳槽的時候就兩次被問到這個問題。二、什麼是面向對象編程有這麼一個公式:程序=數據結構+算法。C語言中一般使用面向過程編程,就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步調用,在函數中對數據結構進行處理(執行算法),也就是說數據結構和算法是分開的。
  • R 的面向對象編程系統(S3、S4系統介紹)
    R 的面向對象編程R 語言中有四套面向對象編程系統:我們所熟悉的
  • C和 C + + 衍生出面向對象的程式語言,我們怎麼自學?
    C#是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言,它包括了諸如單一繼承、接口、與Java幾乎同樣的語法和編譯成中間代碼在運行的過程。它是安全的、穩定的、簡單的、優雅的,由C和C++衍生出來的面向對象的程式語言。
  • C語言實現面向對象的原理
    雖然我們的教材有這麼一個結論:C語言是面向過程的語言,C++是面向對象的程式語言,但面向對象的概念是在C語言階段就有了,而且應用到了很多地方,比如某些作業系統內核、通信協議等。面向對象編程,也就是大家說的OOP(Object Oriented Programming)並不是一種特定的語言或者工具,它只是一種設計方法、設計思想,它表現出來的三個最基本的特性就是封裝、繼承與多態。閱讀文本之前肯定有讀者會問這樣的問題:我們有C++面向對象的語言,為什麼還要用C語言實現面向對象呢?
  • 面向對象編程OOP的C語言實現
    解釋區分一下C語言和OOP我們經常說C語言是面向過程的,而C++是面向對象的,然而何為面向對象,什麼又是面向過程呢?不管怎麼樣,我們最原始的目標只有一個就是實現我們所需要的功能,從這一點說它們是殊途同歸的。過程與對象只是側重點不同而已。
  • 如何用C語言實現面向對象編程OOP?
    如何用C語言實現面向對象編程OOP? 嵌入式資訊精選 發表於 2020-12-18 16:18:19 解釋區分一下C語言和OOP我們經常說C語言是面向過程的,而C++是面向對象的,然而何為面向對象,什麼又是面向過程呢?
  • ...也可以面向對象面層,使用「函數指針結構體」為C語言找個「對象」
    C語言的「對象」事實上,定義好函數指針結構體之後,用起來也和普通數據類型定義的結構體一樣:struct cfun s;// init ss.vfun();s.ifun(a);struct cfun *ps = &s;ps->ffun(x);從上面這幾行C語言代碼可以看出,使用函數指針結構體調用函數,看起來很像其他高級語言中的「面向對象」風格。
  • 一篇非常全的Python 面向對象編程
    轉自:浪子燕青from:  Python編程開發http://www.langzi.fun/Python面向對象編程
  • 史上最全 Python 面向對象編程
    作者:浪子燕青    來自:http://www.langzi.fun/Python面向對象編程.html面向對象編程和函數式編程
  • 史上最全Python面向對象編程
    學神IT教育:XueGod-IT最負責任的線上直播教育平臺面向對象編程中,將函數和變量進一步封裝成類,類才是程序的基本元素
  • TIA Portal面向對象編程入門
    儘管時至今日依然有少數人質疑面向對象的編程思想,但我們看到的是面向對象技術發展的越來越好,無論是後端語言(JAVA、C#)或者前端語言(JavaScript、TypeScript),無一不是完全的支持面向對象技術。現在高校的PLC教材基本上採用的還是五六十年前的編程理念,將PLC定位為傳統繼電器控制的替代,以軟元件、寄存器這種古老落後的概念來講授這一門日新月異的現代工業控制編程技術。
  • 高級篇PLC的面向對象編程
    繼承」,甚至於它根本就不具備面向對象程式語言的特點,但面向對象編程的基本概念就是類和類的實例(即對象),我們只需要使用這種概念就可以了。如果大家從面向對象編程的角度去理解,則可以很好的理解這種設計模式。
  • 史上最全 Python 面向對象編程技巧!
    面向對象編程和函數式編程(面向過程編程)都是程序設計的方法,不過稍有區別。面向過程編程:1. 導入各種外部庫2. 設計各種全局變量3. 寫一個函數完成某個功能4. 寫一個函數完成某個功能5. 寫一個函數完成某個功能6. 寫一個函數完成某個功能7.
  • 轉載 | 史上最全 Python 面向對象編程
    面向對象編程和函數式編程(面向過程編程)都是程序設計的方法,不過稍有區別。導入各種外部庫設計各種全局變量決定你要的類給每個類提供完整的一組操作明確地使用繼承來表現不同類之間的共同點根據需要,決定是否寫一個 main 函數作為程序入口面向對象編程中,將函數和變量進一步封裝成類,類才是程序的基本元素,它將數據和操作緊密地連結在一起,並保護數據不會被外界的函數意外地改變。
  • 面向對象編程會被拋棄嗎?這五大問題不容忽視
    儘管這個想法很巧妙,但直到 1981 年,面向對象編程才成為主流。在那之後,它就沒有停止過吸引新的和經驗豐富的軟體開發者。面向對象的程式設計師市場一如既往地忙碌。 但是在最近幾年中,這種已有幾十年歷史的編程範式受到越來越多的批評。難道是在面向對象編程大行其道 40 年之後,技術已經超越了這種範式?
  • 再談JavaScript面向對象編程
    導讀:陳皓曾發表過一篇文章《Javascript 面向對象編程》,珠玉在前,作者還是忍不住再畫蛇添足的補上一篇文章,主要是因為JavaScript這門語言魅力。另外這篇文章是一篇入門文章,是作者才開始學習Javascript,有一點心得,才想寫一篇這樣文章,文章中難免有錯誤的地方,還請各位不吝吐槽指正。
  • 【譯】使用UIKit進行面向對象的編程
    本文由CocoaChina譯者Leon(社區ID)翻譯原文:iOS 9 Tutorial Series: Protocol-Oriented Programming with UIKit在WWDC 2015上,Apple談了Swift中面向協議編程的話題
  • 真的可以用C語言實現面向對象編程OOP
    解釋區分一下C語言和OOP 我們經常說C語言是面向過程的,而C++是面向對象的,然而何為面向對象,什麼又是面向過程呢?不管怎麼樣,我們最原始的目標只有一個就是實現我們所需要的功能,從這一點說它們是殊途同歸的。
  • 真的可以,用C語言實現面向對象編程OOP
    解釋區分一下C語言和OOP我們經常說C語言是面向過程的,而C++是面向對象的,然而何為面向對象,什麼又是面向過程呢?不管怎麼樣,我們最原始的目標只有一個就是實現我們所需要的功能,從這一點說它們是殊途同歸的。過程與對象只是側重點不同而已。