面向對象這個概念和C語言似乎是無緣的,但如果你真的很想用怎麼辦?幸運的是有人和你的想法一樣,並且做出了實實在在的東西。我了解的比較多的是lw_oopc和ooc兩個東東。
ooc全稱objective oriented c,作者做了大量的工作實現了c語言的封裝、多態、繼承這三種面向對象特征,還實現了所謂的虛函數。老實說,我對ooc的作者佩服的五體投地,能把c語言玩到這個程度非常了得了。ooc的文檔工作做的也不錯,但看了它的doc之後,還是覺得用起來有些麻煩。於是,又去google之,最終找到lw_oopc這個好東東。
lw_oopc僅用了2個文件,.h及.c文件就實現了面向對象的三大因素,實現過程極為簡潔又富含技巧。lw_oopc說白了,就是定義了一堆宏,使用起來也就是調用這些宏。
還是先以一個簡單的例子入手,看看用lw_oopc做一個‘類’是怎樣的。
————————————————————————————————————————————
設計一個抽象類:Animal,屬性有:age,方法有:eat
繼承Animal,設計一個類:Dog,實現其方法
繼承Animal,設計一個類:Bird,增加方法:Fly
代碼如下所示:
***********************************************************<stdio.h> ******************************** (*Init)(Animal* (*Eat)(Animal* Animal_Init(Animal*->age = Animal_Eat(Animal********************************* (*Init)(Dog* Dog_Init(Dog*-> Dog_Eat(Animal********************************* (*Init)(Bird* (*Fly)(Bird* Bird_Init(Bird*-> Bird_Fly(Bird* Bird_Eat(Animal*
有了這些定義,用起來就跟簡單c++的類一樣了,只是定義一個類的實例時應采用如下一種格式:
Dog* dog =->Init(dog);
調用自身的方法:
Bird* bird = ->->Fly(bird);
調用繼承的方法稍顯麻煩:
((Animal*)bird)->Eat((Animal*)bird);
或者當EXTENDS語句在定義類時並不在第一句(下一篇將揭露各個宏的真實面目)時,最穩妥也顯得繁瑣一點的方式為:
SUPER_PTR(bird, Animal)->Eat(SUPER_PTR(bird, Animal));
是不是有那麼點意思,抽象、繼承、多態幾個概念都包含了。同樣能看出,用了lw_oopc後並沒有減少你的代碼量,而是增加了不少。但用它的目的並非是減少體力輸出,而是對軟件結構的一種改良。
各個宏的真實面目留待下一篇揭露。