加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • C語言實(shí)現(xiàn)各部分功能
    • 封裝
    • 繼承
    • 多態(tài)
    • 整體編程思路
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

C語言的面向?qū)ο缶幊?/h1>

2023/01/05
710
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

面向?qū)ο缶幊淌且环N思想,并非一定要用哪種語言去實(shí)現(xiàn),c語言也可以實(shí)現(xiàn)面向?qū)ο缶幊?。通過結(jié)構(gòu)體和指針就可以實(shí)現(xiàn)。

C語言實(shí)現(xiàn)各部分功能

面向?qū)ο笾饕挠?a class="article-link" target="_blank" href="/baike/492719.html">封裝、繼承、多態(tài)。下面說下如何用C語言實(shí)現(xiàn)。

封裝

封裝的作用是減少對(duì)外的接口

typedef struct {
UART_X_Information UART_X; //
uint16_t data_num;
uint8_t *receive_data;
uint32_t EventValue;
UART_HandleTypeDef huart;
uint8_t (*frame_data);
uint32_t frame_num;
uint32_t frame_num_all;
uint8_t send_num;
struct UARTTable *vptr; // 虛表指針

} UART_X_MIX;

struct UARTTable{
uint8_t* (*UARTx_Rx)(UART_X_MIX *this); // 虛函數(shù)指針

uint32_t (*UARTx_Tx)(UART_X_MIX *this); // 虛函數(shù)指針 發(fā)送串口數(shù)據(jù)
uint32_t (*UARTx_Tx_Frame)(UART_X_MIX *this); // 虛函數(shù)指針 組幀數(shù)據(jù)
};

如以上代碼,包含要使用到的參數(shù),和一個(gè)指向包含函數(shù)指針的結(jié)構(gòu)體,其中的函數(shù)均使用結(jié)構(gòu)體中的內(nèi)容作為參數(shù)。這樣就減少了與外部的聯(lián)系,盡量做到高內(nèi)聚、低耦合。

繼承

繼承用于擴(kuò)展,比如要在之前的功能上增加新的東西,就可以新定義一個(gè)結(jié)構(gòu)體,新的結(jié)構(gòu)體包含老的結(jié)構(gòu)體

typedef struct {
UART_X_MIX UART_X_MIX; //
uint16_t test;
struct test *vptr2; // 虛表指針
} UART_X_MIX_test;
struct test {
uint8_t* (*test1)(UART_X_MIX_test*this); // 虛函數(shù)指針
};

這樣就可以使用上一級(jí)節(jié)點(diǎn)的功能(父節(jié)點(diǎn))。

多態(tài)

多態(tài)是根據(jù)使用要求的不一樣,動(dòng)態(tài)實(shí)現(xiàn)不同功能。具體的實(shí)現(xiàn)是對(duì)上述的虛表指針(struct UARTTable *vptr)賦予不同的地址(不同函數(shù))。這樣就實(shí)現(xiàn)了動(dòng)態(tài)變化功能。

整體編程思路

1 定義一個(gè)包含所需變量和虛表指針(可以為函數(shù)指針,或者包含函數(shù)指針的結(jié)構(gòu)體)的結(jié)構(gòu)體。

typedef struct {
uint8_t send_num;
...
struct UARTTable *vptr; // 虛表指針
} UART_X_MIX;struct UARTTable{
uint8_t* (*UARTx_Rx)(UART_X_MIX *this); // 虛函數(shù)指針
...
};

2 編寫結(jié)構(gòu)體賦值函數(shù)

uint8_t *UARTx_Rx(UART_X_MIX * this)
{
...
}
void UART1_TX_INIT(UART_X_MIX *this,send_num)
{
static struct UARTTable UARTTable = {UARTx_Rx};
// 讓虛表指針指向上面這個(gè)虛表
this->send_num= send_num;
this->vptr = &UARTTable;
}

使用UART6_TX_INIT()函數(shù)對(duì)結(jié)構(gòu)體賦值

3 結(jié)構(gòu)體賦值,運(yùn)行函數(shù)

UART1_X_INIT(&UART1_X_MIX,send_num);
UART1_X_MIX.vptr->UARTx_Rx(&UART1_X_MIX);

先給結(jié)構(gòu)體賦值,然后運(yùn)行函數(shù)。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜