• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C語言中的面向對象(2)-C語言的多態實現

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    C語言中的 面向對象 (2)-C語言的多態實現: 相信很多人都看過設計模式方面的書,大家有什么體會呢?Bridge,Proxy,Factory這些設計模式都是基于抽象類的。使用抽象對象是這里的一個核心。 其實我覺得框架化編程的一個核心問題是抽象,用抽象的對象構建程序
    C語言中的面向對象(2)-C語言的多態實現:

      相信很多人都看過設計模式方面的書,大家有什么體會呢?Bridge,Proxy,Factory這些設計模式都是基于抽象類的。使用抽象對象是這里的一個核心。
          
      其實我覺得框架化編程的一個核心問題是抽象,用抽象的對象構建程序的主體框架,這是面向對象編程的普遍思想。用抽象構建骨架,再加上多態就形成了一個完整的程序。由于C++語言本身實現了繼承和多態,使用這樣的編程理念(理念啥意思?跟個風,嘿嘿)在C++中是十分普遍的現象,可以說Virtual(多態)是VC的靈魂。
     
      但是,使用C語言的我們都快把這個多態忘光光了。我常聽見前輩說,類?多態?我們用的是C,把這些忘了吧。很不幸的是,我是一個固執的人。這么好的東西,為啥不用呢。很高興的,在最近的一些純C代碼中,我看見了C中的多態!下面且聽我慢慢道來。
     
      1. VC中的Interface是什么

      Interface:中文解釋是接口,其實它表示的是一個純虛類。不過我所要說的是,在VC中的Interface其實就是struct,查找Interface的定義,你可以發現有這樣的宏定義:

           #Ifndef Interface
           #define Interface struct
           #endif

      而且,實際上在VC中,如果一個類有Virtual的函數,則類里面會有vtable,它實際上是一個虛函數列表。實際上C++是從C發展而來的,它不過是在語言級別上支持了很多新功能,在C語言中,我們也可以使用這樣的功能,前提是我們不得不自己實現。
     
      2.C中如何實現純虛類(我稱它為純虛結構)

      比較前面,相信大家已經豁然開朗了。使用struct組合函數指針就可以實現純虛類。

      例子:

         typedef struct {
            void  (*Foo1)();
            char  (*Foo2)();
            char*  (*Foo3)(char* st);
        }
        MyVirtualInterface;
          
      這樣假設我們在主體框架中要使用橋模式。(我們的主類是DoMyAct,接口具體實現類是Act1,Act2)下面我將依次介紹這些“類”。(C中的“類”在前面有說明,這里換了一個,是使用早期的數組的辦法)
     
      主類DoMyAct: 主類中含有MyVirtualInterface* m_pInterface; 主類有下函數:

        DoMyAct_SetInterface(MyVirtualInterface* pInterface)
        {
            m_pInterface= pInterface;
        }
        DoMyAct_Do()
        {
            if(m_pInterface==NULL) return;
            m_pInterface->Foo1();
            c=m_pInterface->Foo2();
        }

      子類Act1:實現虛結構,含有MyVirtualInterface  st[MAX]; 有以下函數:

        MyVirtualInterface* Act1_CreatInterface()
        {
            index=FindValid() //對象池或者使用Malloc !應該留在外面申請,實例化
            if(index==-1) return NULL;
            St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具體實現
            St[index].Foo2=Act1_Foo2;
            St[index].Foo3=Act1_Foo3;
            Return &st [index];
        }

      子類Act2同上。
     
      在main中,假設有一個對象List。List中存貯的是MyVirtualInterface指針,則有:

        if( (p= Act1_CreatInterface()) != NULL)
        List_AddObject(&List, p); //Add All
     
        While(p=List_GetObject()){
            DoMyAct_SetInterface(p);//使用Interface代替了原來大篇幅的Switch Case
            DoMyAct_Do();//不要理會具體的什么樣的動作,just do it
        }
     
        FREE ALL

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>