天天看點

C語言中的面向對象(1)-類模拟和多态,繼承

在面向對象的語言裡面,出現了類的概念。這是程式設計思想的一種進化。所謂類:是對特定資料的特定操作的集合體。是以說類包含了兩個範疇:資料和操作。而C語言中的struct僅僅是資料的集合。([email protected])

  1.執行個體:下面先從一個小例子看起#ifndef C_Class#define C_Class struct#endifC_Class A {C_Class A *A_this;void (*Foo)(C_Class A *A_this);int a;int b;};C_Class B{ //B繼承了AC_Class B *B_this; //順序很重要void (*Foo)(C_Class B *Bthis); //虛函數int a;int b;int c;};void B_F2(C_Class B *Bthis){printf("It is B_Fun\n");}void A_Foo(C_Class A *Athis){printf("It is A.a=%d\n",Athis->a);//或者這裡// exit(1);// printf("純虛 不允許執行\n");//或者這裡}void B_Foo(C_Class B *Bthis){printf("It is B.c=%d\n",Bthis->c);}void A_Creat(struct A* p){p->Foo=A_Foo;p->a=1;p->b=2;p->A_this=p;}void B_Creat(struct B* p){p->Foo=B_Foo;p->a=11;p->b=12;p->c=13;p->B_this=p;}int main(int argc, char* argv[]){C_Class A *ma,a;C_Class B *mb,b;A_Creat(&a);//執行個體化B_Creat(&b);mb=&b;ma=&a;ma=(C_Class A*)mb;//引入多态指針printf("%d\n",ma->a);//可惜的就是 函數變量沒有privatema->Foo(ma);//多态a.Foo(&a);//不是多态了B_F2(&b);//成員函數,因為效率問題不使用函數指針return 0;}  輸出結果:

11It is B.c=13It is A.a=1It is B_Fun  2.類模拟解說:

  我在網上看見過一篇文章講述了類似的思想(據說C++程式設計思想上有更加詳細的解說,可惜我沒空看這個了,如果有知道的人說一說吧)。但是就象C++之父說的:"C++和C是兩種語言"。是以不要被他們在文法上的類似就混淆使用,那樣有可能會導緻一些不可預料的事情發生。

  其實我很同意這樣的觀點,本文的目的也不是想用C模拟C++,用一個語言去模拟另外一個語言是完全沒有意義的。我的目的是想解決C語言中,整體架構結構過于分散、以及資料和函數脫節的問題。

  C語言的一大問題是結構松散,雖然現在好的大型程式都基本上按照一個功能一個檔案的設計方式,但是無法做到更小的顆粒化——原因就在于它的資料和函數的脫節。類和普通的函數集合的最大差別就在于這裡。類可以執行個體化,這樣相同的函數就可以對應不同的執行個體化類的變量。

  自然語言的一個特點是概括:比如說表。可以說手表,鐘表,秒表等等,這樣的描述用面向對象的語言可以說是抽象(繼承和多态)。但是我們更要注意到,即使對應于手表這個種類,還是有表鍊的長度,表盤的顔色等等細節屬性,這樣細微的屬性如果還用抽象,就無法避免類膨脹的問題。是以說類用成員變量來描述這樣的屬性。這樣執行個體并初始化不同的類,就描述了不同屬性的對象。

  但是在C語言中,這樣做是不可能的(至少語言本身不提供這樣的功能)。C語言中,如果各個函數要共享一個變量,必須使用全局變量(一個檔案内)。但是全局變量不能再次執行個體化了。是以通常的辦法是定義一個數組。以往C語言在處理這樣的問題的時候通常的辦法就是這樣,比如說socket的号,handel等等其實都是數組的下标。(不同的連接配接對應不同的号,不同的視窗對應不同的handel,其實這和不同的類有不同的成員變量是一個意思)

  個人認為:兩種形式(數組和模拟類)并無本質的差別(如果不考慮虛函數的應用的話),它們的唯一差別是:數組的辦法将空間申請放在了"子產品"内,而類模拟的辦法将空間申請留給了外部,可以說就這一點上,類模拟更加靈活。

  3.其他的話:

  我的上述思想還是很不成熟的,我的目的是想讓C語言程式設計者能夠享受面向對象程式設計的更多樂趣。我們僅僅面對的是浩瀚的"黑箱",我們的工作是堆砌代碼,而且如果要更改代碼功能的時候,僅僅換一個黑箱就可以了。

  而更大的目的是促使這樣的黑箱的産生。或許有一天,一種效率很好,結構很好的語言将會出現。那個時候程式設計是不是就會象說話一樣容易了呢?\

閱讀:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7338284/viewspace-218018/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/7338284/viewspace-218018/