既然如此,在執行時決定跳到哪個地方去執行特定的**就可以。
以音訊解碼器作為樣例:aac 解碼器,mpeg解碼器。以及其它型別的解碼器。
那手動的多型可能會這樣實現:
u32 audiohandle = audiodecopen(int type)
這種**不利於擴充套件,沒增加乙個新的例項。就得修改audiodecopen這個函式。並且封裝的不好。
首先定義三種公有函式的函式指標。
typedef int (*openfunc) (void *this);
typedef int (*closefunc) (void *this);
typedef int (*controlfunc) (void *this, int command, void *param);
定義公共介面結構體 & audiodecoder 物件:
struct module
;struct audiodecoder;
提供乙個表驅動來方便找到相應的入口:
struct audiopoolpool = ,,};
int audiocreate(int type , handle *handle)
}*handle = (handle)dec;
}
這樣,當外界去create乙個audio的物件時,就已經初始化好相應的函式入口了。open就非常easy了:
int audioopen(struct audiodecoder *dec)
當中audiodecoder中的private 則是在各自的open中自己申請,自己釋放,close,control 相似。
今後維護這個表驅動就可以(pool),新的物件的支援增加進來就可以了,非常方便維護。
如今的pool依舊拓展性不太好,畢竟每次增加新的物件都得修改pool這個表驅動。
這裡提供乙個更好的方法:
struct audiopoolpool[max_pool];
在提供乙個pool_register(int type , struct module* module); 的功能:
int pool_register(int type , struct module* module);
}if(k == null)
return no_error;
}
這樣在每乙個例項中呼叫 rigister 就能夠非常優雅的解決問題。
附上兩個解碼器的物件的**,mpeg的解碼器使用的是 libmad , aac的解碼器使用的是 libfaad 庫:
aac**片段:
...
static int close(void *this)
aacfaadprivate *private = (aacfaadprivate *)ad->privatedata;
private->exit = true;
if(private->decoderpid > 0)
if(private->hdecoder)
free(private);
ad->privatedata = null;
return ct_error_no_error;
}int aac_init()
mpeg**片段:
...
int close(void *this)
mpegmadprivate *private = (mpegmadprivate *)ad->privatedata;
private->exit = true;
if(private->decoderpid > 0)
mad_decoder_finish(&private->decoder);
if(private->data.buffer)
free(private);
ad->privatedata = null;
return ct_error_no_error;
}int control(void *this , u32 cmd ,void* param)
int mpeg_init()
使用物件導向來設計自己的**。維護上能夠降低非常多工作量。
在c語言裡面還實現了mvc模式等,這部分也是函式指標實現的。實際上僅僅是乙個**。
可是**維護,模組劃分上,非常清晰。
C語言實現多型
c 中的多型是指 通過基類物件的指標或者基類物件的引用呼叫虛函式 表現更多派生類的特性,但根據c 多型的實現,我們發現這種方法存在一定的空間和效率的折損。不可否認,多型輕鬆解決了很多任務程中遇到的問題,這與 pure c 的解決方法比起來,更為優雅。在考慮移植性上,c 的光芒要蓋過 c 但 c 的多...
C語言實現多型
多型性是物件導向程式設計的乙個重要特徵,利用多型性可以設計和實現乙個易於擴充套件的系統。顧名思義,多型的意思是多種形態,在c 程式設計中,多型指的是 具有不同功能的函式可以用同乙個函式名,這樣可以用乙個函式名呼叫不同內容的函式。c 的多型分兩種 靜態多型性和動態多型性。c 中的函式過載和運算子過載實...
C 語言實現 C 多型
c 中的多型是指 通過基類物件的指標或者基類物件的引用呼叫虛函式 表現更多派生類的特性,但根據 c 多型的實現,我們發現這種方法存在一定的空間和效率的折損。不可否認,多型輕鬆解決了很多任務程中遇到的問題,這與 pure c 的解決方法比起來,更為優雅。在考慮移植性上,c 的光芒要蓋過 c 但 c 的...