freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

輕量級(jí)的面向?qū)ο骳語(yǔ)言編程框架介紹(已修改)

2025-01-19 10:38 本頁(yè)面
 

【正文】 輕量級(jí)的面向?qū)ο?C 語(yǔ)言 編程框架 LW_OOPC 介紹 金永華 、陳國(guó)棟 2022/03/02 摘要: 本文介紹一種輕量級(jí)的面向?qū)ο蟮?C 語(yǔ)言編程框架 : LW_OOPC。 LW_OOPC 是LightWeight ObjectOriented Programming in(with) C 的縮寫(xiě) , 總共一個(gè) .h 文件, 20 個(gè)宏, 約130 行代碼,非常的輕量級(jí),但 卻很好的支持了很多 面向?qū)ο?的 特性,比如繼承、多態(tài),可以優(yōu)美的實(shí)現(xiàn)面向接口編程。這個(gè)框架 系 由臺(tái)灣 的 高煥堂先生以及他的 MISOO 團(tuán)隊(duì) 首 創(chuàng),之后 由 我繼續(xù) 改進(jìn)優(yōu)化, 最后,經(jīng)高煥 堂 同意 以 LGPL 協(xié)議開(kāi)源 (開(kāi)源網(wǎng)址 參見(jiàn)后文 ) 。 用 C 語(yǔ)言實(shí)現(xiàn) OO?我沒(méi)聽(tīng)錯(cuò)嗎?這聽(tīng)起來(lái)真是太瘋狂了! … 大家都知道 , C++支持了面向?qū)ο蠛兔嫦蚍盒途幊?,?C 要更強(qiáng)大些。那么,為什么要在 C 語(yǔ)言中實(shí)踐面向?qū)ο竽兀繛槭裁床恢苯邮褂?C++呢? 為什么要用面向?qū)ο螅? 面向 過(guò)程方式開(kāi)發(fā)的系統(tǒng),代碼復(fù)雜,耦合性強(qiáng),難以維護(hù), 隨著我們所要解決的 問(wèn)題越來(lái)越復(fù)雜,代碼也變得越來(lái)越復(fù)雜, 越來(lái)越難以掌控, 而面向?qū)ο蟾淖兞顺绦騿T的思維方式,以更加符合客觀世界的方式來(lái)認(rèn)識(shí)世界,通過(guò) 合理的運(yùn)用 抽象、 封裝、繼承和多態(tài),更好的組織程序, 從而 很好地 應(yīng)對(duì)這種復(fù)雜性。 為什么不直接使用 C++? C 和 C++之爭(zhēng)由來(lái)已久, 可能 要持續(xù)到它們中的一種去世 ^_^。 C 語(yǔ)言 以其 簡(jiǎn)潔明快,功能強(qiáng)大 的特點(diǎn) , 深 得開(kāi)發(fā)人員的 喜愛(ài),尤其是在嵌入式開(kāi)發(fā) 領(lǐng)域 , C 語(yǔ)言更是占據(jù)了絕對(duì)老大的地位。在我看來(lái),語(yǔ)言只是工具,作為程序員,我們要做的是:選擇合適的語(yǔ)言,解決恰當(dāng)?shù)膯?wèn)題。 我們 要 尊重事實(shí),考慮 開(kāi)發(fā) 環(huán)境(軟硬件環(huán)境),考慮團(tuán)隊(duì)成員的水平,從商用工程的角度講,選擇團(tuán)隊(duì)成員擅長(zhǎng)的語(yǔ)言進(jìn)行開(kāi)發(fā), 風(fēng)險(xiǎn)要小很多。 一些 從 Java/C轉(zhuǎn)到 C 的程序員們,無(wú)法從面向?qū)ο笄袚Q到面向過(guò)程 ,但又必須與 C 語(yǔ)言同事們?cè)谶z留的 C 系統(tǒng)上開(kāi)發(fā)軟件,他們有時(shí)會(huì)非常困惑: C 語(yǔ)言是面向過(guò)程的編程語(yǔ)言,如何實(shí)踐面向?qū)ο?,甚至面向接口編?呢 ?此時(shí),就非常需要 在 C 語(yǔ)言 中 實(shí)現(xiàn)面向?qū)ο蟮氖侄危?LW_OOPC 正是 應(yīng)對(duì)這一 難題的 解決之道 。 LW_OOPC 是什么? 簡(jiǎn)而言之: LW_OOPC 是一套 C 語(yǔ)言的宏,總共 1 個(gè) .h 文件 (如果需要內(nèi)存泄漏 檢測(cè)支持以及 調(diào)試打印 支持 , 那么還 需要 1 個(gè) .c 文件 ( ,約 145 行) ) , 20 個(gè)宏, 約 130行代碼 。 LW_OOPC 是一種 C 語(yǔ)言編程框架,用于支持在 C 語(yǔ)言中進(jìn)行 面向?qū)ο?編 程 。 LW_OOPC 宏介紹 下面 ,先通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)展示 LW_OOPC 這套宏的使用方法。我們要?jiǎng)?chuàng)建這樣一些對(duì)象:動(dòng)物( Animal),魚(yú)( Fish),狗( Dog),車子( Car)。顯然,魚(yú)和狗都屬于動(dòng)物,都會(huì)動(dòng),車子也會(huì)動(dòng),但是車子不是動(dòng)物。會(huì)動(dòng)是這些對(duì)象的共同特 征,但是,顯然它們不屬于一個(gè)家族。因此,我們 首先 考慮抽象出一個(gè)接口( IMoveable),以描述會(huì)動(dòng)這一行為特征: INTERFACE(IMoveable) { void (*move)(IMoveable* t)。 // Move行為 }。 INTERFACE 宏 用于定義接口,其成員(方法)均是函數(shù)指針類型。 然后,我們分析 Animal,它應(yīng)該是抽象類還是接口 呢?動(dòng)物都會(huì)吃,都需要呼吸,如果僅僅考慮這兩個(gè)特征,顯然可以把 Animal 定為接口。不過(guò),這里,為了展示抽象類在LW_OOPC 中如何應(yīng)用。 我們 讓 Animal 擁有昵稱和年齡屬性,并且,讓動(dòng)物和我們打招呼( sayHello 方法 ),但,我們不允許用戶直接創(chuàng)建 Animal 對(duì)象,所以,這里把 Animal 定為抽象類: ABS_CLASS(Animal) { char name[128]。 // 動(dòng)物的昵稱 (假設(shè)小于 128個(gè)字符 ) int age。 // 動(dòng)物的年齡 void (*setName)(Animal* t, const char* name)。 // 設(shè)置動(dòng)物的昵稱 void (*setAge)(Animal* t, int age)。 // 設(shè)置動(dòng)物的年齡 void (*sayHello)(Animal* t)。 // 動(dòng)物打招呼 void (*eat)(Animal* t)。 // 動(dòng)物都會(huì)吃(抽象方法,由子類實(shí)現(xiàn)) void (*breathe)(Animal* t)。 // 動(dòng)物都會(huì)呼吸(抽象方法,由子類實(shí)現(xiàn)) void (*init)(Animal* t, const char* name, int age)。 // 初始化昵稱和年齡 }。 ABS_CLASS 宏用于定義抽象類,允許有成員屬性。代碼的含義參見(jiàn)代碼注釋。 緊接 著,我們 來(lái) 定義 Fish 和 Dog 類 ,它們都繼承動(dòng)物,然后還實(shí)現(xiàn) 了 IMoveable 接口: CLASS(Fish) { EXTENDS(Animal)。 // 繼承 Animal抽象類 IMPLEMENTS(IMoveable)。 // 實(shí)現(xiàn) IMoveable接口 void (*init)(Fish* t, const char* name, int age)。 // 初始化昵稱和年齡 }。 CLASS(Dog) { EXTENDS(Animal)。 // 繼承 Animal抽象類 IMPLEMENTS(IMoveable)。 // 實(shí)現(xiàn) IMoveable接口 void(*init)(Dog* t, const char* name, int age)。 // 初始化昵稱和年齡 }。 為了讓 Fish 對(duì)象或 Dog 對(duì)象在創(chuàng)建之后,能夠很方便地初始化昵稱和年齡, Fish 和 Dog類均提供了 init 方法。 下面,我們來(lái)定義 Car,車子 不是動(dòng)物,但可以 Move,因此,讓 Car 實(shí)現(xiàn) IMoveable 接口即可: CLASS(Car) { IMPLEMENTS(IMoveable)。 // 實(shí)現(xiàn) IMoveable接口(車子不是動(dòng)物,但可以 Move) }。 接口,抽象類,具體類的定義都已經(jīng)完成了。 下面,我們開(kāi)始實(shí)現(xiàn)它們。接口是不需要實(shí)現(xiàn)的,所以 IMoveable 沒(méi)有對(duì)應(yīng)的實(shí)現(xiàn)代碼。 Animal 是抽象動(dòng)物接口,是半成品,所以需要提供半成品的實(shí)現(xiàn): /* 設(shè)置動(dòng)物的昵稱 */ void Animal_setName(Animal* t, const char* name) { // 這里假定 name不會(huì)超過(guò) 128個(gè)字符,為簡(jiǎn)化示例代碼,不做保護(hù)(產(chǎn) 品代碼中不要這樣寫(xiě)) strcpy(tname, name)。 } /* 設(shè)置動(dòng)物的年齡 */ void Animal_setAge(Animal* t, int age) { tage = age。 } /* 動(dòng)物和我們打招呼 */ void Animal_sayHello(Animal* t) { printf(Hello! 我是 %s,今年 %d歲了! \n, tname, tage)。 } /* 初始化動(dòng)物的昵稱和年齡 */ void Animal_init(Animal* t, const char* name, int age) { tsetName(t, name)。 tsetAge(t, age)。 } ABS_CTOR(Animal) FUNCTION_SETTING(setName, Animal_setName)。 FUNCTION_SETTING(setAge, Animal_setAge)。 FUNCTION_SETTING(sayHello, Animal_sayHello)。 FUNC
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號(hào)-1