最近在學習linux核心的原始碼,linux核心大量使用了類似c++繼承和多型的方式,對裝置進行封裝和功能呼叫,設計模式相當精妙,這裡簡單講解下其大致思路。才疏學淺,第一次寫部落格,如有問題,大家多多指教。
我的大致思路是動物作為乙個基類,包含所有動物都具有的功能(linux核心中就是各種ops)如eat,walk,talk,其下有派生類dog(或其他動物),dog又具有自己的功能和具有動物類的功能,我們將dog繼承的animal的ops指向dog類我們自己定義的dog的ops,在呼叫dog繼承的animal的ops具體的函式指標,就會指向animal中dog特有的ops。
定義乙個animal基類,以及animal共有的ops
/* 動物類,是所有動物類的基類,也是抽象類 */
struct animal_s_
;/* 動物的基本行為 */
struct animal_ops_s_
;
派生出乙個dog類
struct dog_s_
;
我們自己定義的dog的ops,以及其具體的功能,如dog eat bone
//定義dog的ops,animal_eat等來自struct animal_ops_s_
struct animal_ops_s_ dog_ops =
;//dog類的ops具體的實現
static
void
dog_eat
(char *food)
static
void
dog_walk
(int steps)
static
void
dog_talk
(char *msg)
dog_init,最終呼叫dog繼承的animal的ops指向我們自己定義的dog特有的ops
//dog_init
struct dog_s_ *
dog_init()
main函式實現
int main
(int argc,
const char *ar**)
最終執行效果如下
當然linux核心中驅動的**並不簡單,這裡只是其一種封裝模式。實際上當dog的ops逐漸增多時,逐個呼叫便顯得不是那麼方便,或者當有多個animal的派生類被給出時,使用類似多型的方式進行再次封裝,就很簡潔了。
多型封裝函式animal_self
void
animal_self
(struct animal_s_ *animal, char *food, int steps, char *msg)
這樣只需要呼叫animal_self函式,將派生類賦給第乙個引數,對不同的animal派生類就可以實現類似多型的功能。
//animal派生類的多型呼叫
animal_self
(dog,
"bone",5
,"wuang wuang wuang..."
);
C語言和設計模式(繼承 封裝 多型)
記得還在我們大學c 第一門課的時候,老師就告訴我們說,c 是一門物件導向的語言。c 有三個最重要的特點,即繼承 封裝 多型。等到後來隨著編碼的增多和工作經驗的積累,我也慢慢明白了物件導向的含義。可是,等我工作以後,使用的程式語言更多的是c語言,這時候我又想能不能把c語言變成物件導向的語言呢?等到後來...
C語言模式實現C 繼承和多型
這個問題主要考察的是c和c 的區別,以及c 中繼承和多型的概念。c和c 的區別 c語言是面向過程的語言,而c 是物件導向的過程。什麼是物件導向和面向過程?面向過程就是分析解決問題的步驟,然後用函式把這些步驟一步一步的進行實現,在使用的時候進行一一呼叫就行了,注重的是對於過程的分析。物件導向則是把構成...
C語言模式實現C 繼承和多型
c實現乙個struct a和struct b各包含乙個int成員a和b,要求達到b繼承了a的效果,也就是b裡面包含乙個a。並且能達到多型的效果,也就是乙個a p指向a調的是a的函式,指向b呼叫的是b的函式。1.繼承 1 c 的繼承 在c 中,可以用乙個類 子類 去繼承另乙個類 父類 子類可以得到父類...