C語言中的類類比(C++編程思想)

來源:互聯網
上載者:User

   在物件導向的語言裡面,出現了類的概念。這是編程思想的一種進化。所謂類:是對特定資料的特定操作的集合體。所以說類包含了兩個範疇:資料和操作。而C語言中的struct僅僅是資料的集合。
  1.執行個體:下面先從一個小例子看起
  #ifndef C_Class
   #define C_Class struct
  #endif
  C_Class A {
   C_Class A *A_this;
   void (*Foo)(C_Class A *A_this);
   int a;
   int b;
  };
  C_Class B{ //B繼承了A
   C_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);//可惜的就是 函數變數沒有private
   ma->Foo(ma);//多態
   a.Foo(&a);//不是多態了
   B_F2(&b);//成員函數,因為效率問題不使用函數指標
   return 0;
  }
  輸出結果:
  11
  It is B.c=13
  It is A.a=1
  It is B_Fun
  2.類類比解說:
   我在網上看見過一篇文章講述了類似的思想(據說C++編程思想上有更加詳細的解說,可惜我沒空看這個了,如果有知道的人說一說吧)。但是就象C++之父說的:“C++和C是兩種語言”。所以不要被他們在文法上的類似就混淆使用,那樣有可能會導致一些不可預料的事情發生。
   其實我很同意這樣的觀點,本文的目的也不是想用C類比C++,用一個語言去類比另外一個語言是完全沒有意義的。我的目的是想解決C語言中,整體架構結構過於分散、以及資料和函數脫節的問題。
   C語言的一大問題是結構鬆散,雖然現在好的大型程式都基本上按照一個功能一個檔案的設計方式,但是無法做到更小的顆粒化――原因就在於它的資料和函數的脫節。類和普通的函數集合的最大區別就在於這裡。類可以執行個體化,這樣相同的函數就可以對應不同的執行個體化類的變數。
   自然語言的一個特點是概括:比如說表。可以說手錶,鐘錶,秒錶等等,這樣的描述用物件導向的語言可以說是抽象(繼承和多態)。但是我們更要注意到,即使對應於手錶這個種類,還是有錶鏈的長度,錶盤的顏色等等細節屬性,這樣細微的屬性如果還用抽象,就無法避免類膨脹的問題。所以說類用成員變數來描述這樣的屬性。這樣執行個體並初始化不同的類,就描述了不同屬性的對象。
   但是在C語言中,這樣做是不可能的(至少語言本身不提供這樣的功能)。C語言中,如果各個函數要共用一個變數,必須使用全域變數(一個檔案內)。但是全域變數不能再次執行個體化了。所以通常的辦法是定義一個數組。以往C語言在處理這樣的問題的時候通常的辦法就是這樣,比如說socket的號,handel等等其實都是數組的下標。(不同的串連對應不同的號,不同的視窗對應不同的handel,其實這和不同的類有不同的成員變數是一個意思)
   個人認為:兩種形式(數組和類比類)並無本質的區別(如果不考慮虛函數的應用的話),它們的唯一區別是:數組的辦法將空間申請放在了“模組”內,而類類比的辦法將空間申請留給了外部,可以說就這一點上,類類比更加靈活。
  3.其他的話:
   我的上述思想還是很不成熟的,我的目的是想讓C語言編程者能夠享受物件導向編程的更多樂趣。我們僅僅面對的是浩瀚的“黑箱”,我們的工作是堆砌代碼,而且如果要更改代碼功能的時候,僅僅換一個黑箱就可以了。
   而更大的目的是促使這樣的黑箱的產生。或許有一天,一種效率很好,結構很好的語言將會出現。那個時候編程是不是就會象說話一樣容易了呢

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.