最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

純c語言實現(xiàn)面向?qū)ο蠓治雠c示例分享

 更新時間:2014年01月10日 10:12:18   作者:  
采用C語言實現(xiàn)的關(guān)鍵是如何運用C語言本身的特性來實現(xiàn)多態(tài)、繼承面、封裝的面向?qū)ο蟮奶卣?最近給出了例子,大家可以參考使用

C語言的對象化模型
面向?qū)ο蟮奶卣髦饕ǎ?BR>.封裝,隱藏內(nèi)部實現(xiàn)
.繼承,復用現(xiàn)有代碼
.多態(tài),改寫對象行為
1.1  封裝
封裝是一種信息隱蔽技術(shù),它體現(xiàn)于類的說明,是對象的重要特性。封裝使數(shù)據(jù)和加工該數(shù)據(jù)的方法(函數(shù))封裝為一個整體,以實現(xiàn)獨立性很強的模塊,使得用戶只能見到對象的外特性(對象能接受哪些消息,具有那些處理能力),而對象的內(nèi)特性(保存內(nèi)部狀態(tài)的私有數(shù)據(jù)和實現(xiàn)加工能力的算法)對用戶是隱蔽的。封裝的目的在于把對象的設(shè)計者和對象者的使用分開,使用者不必知曉行為實現(xiàn)的細節(jié),只須用設(shè)計者提供的消息來訪問該對象。
在C語言中,大多數(shù)函數(shù)的命名方式是動詞+名詞的形式,例如要獲取一個semaphore,會命名
成take_semaphore,重點在take這個動作上。面向?qū)ο缶幊讨袆偤孟喾?,命名為rt_sem_take,即名詞+動詞的形式,重點在名詞上,體現(xiàn)了一個對象的方法。另外對于某些方法,僅局限在對象內(nèi)部使用,它們將采用static修辭把作用范圍局限在一個文件的內(nèi)部。通過這樣的方式,把一些不想讓用戶知道的信息屏蔽在封裝里,用戶只看到了外層的接口,從而形成了面向?qū)ο笾械淖罨镜膶ο蠓庋b實現(xiàn)。

一般屬于某個類的對象會有一個統(tǒng)一的創(chuàng)建,析構(gòu)過程。
對象內(nèi)存數(shù)據(jù)塊已經(jīng)存在,需要對它進行初始化 – rt_sem_init;對象內(nèi)存數(shù)據(jù)塊還未分配,需要創(chuàng)建并初始化 – rt_sem_create??梢赃@么認為,對象的創(chuàng)建(create)是以對象的初始化(init)為基礎(chǔ)的,創(chuàng)建動作相比較而言多了個內(nèi)存分配的動作。
相對應(yīng)的兩類析構(gòu)方式:
.由rt_sem_init初始化的semaphore對象 – rt_sem_detach;
.由rt_sem_create創(chuàng)建的semaphore對象 – rt_sem_delete.

1.2  繼承
繼承性是子類自動共享父類之間數(shù)據(jù)和方法的機制。它由類的派生功能體現(xiàn)。一個類直接繼承其它類的全部描述,同時可修改和擴充。繼承具有傳遞性。繼承分為單繼承(一個子類只有一父類)和多重繼承(一個類有多個父類,當前RT-Thread的對象系統(tǒng)不能支持)。類的對象是各自封閉的,如果沒繼承性機制,則類對象中數(shù)據(jù)、方法就會出現(xiàn)大量重復。繼承不僅支持系統(tǒng)的可重用性,而且還促進系統(tǒng)的可擴充性。

類似的實現(xiàn)代碼如下程序清單:

復制代碼 代碼如下:

/*  父類  */
struct  parent_class
{
  int  a,  b;
  char  *str;
};

/*  繼承于父類的子類  */
struct  child_class
{
  struct  parent class  p;
  int  a,  b;
};

/*  操作示例函數(shù)*/
void  func()
{
  struct  child_class  obj,  *obj_ptr;  /*  子類對象及指針  */
  struct  parent_class  *parent_ptr;  /*  父類指針  */
  obj_ptr  =  &obj;

  /*  取父指針  */
  parent_ptr  =  (struct  parent*)  &obj;

  /*  可通過轉(zhuǎn)換過類型的父類指針訪問相應(yīng)的屬性  */
  parent ptr->a  =  1;
  parent ptr->b  =  5;

  /*  子類屬性的操作  */
  obj ptr->a  =  10;
  obj ptr->b  =  100;
}

在上面代碼中,注意child_class結(jié)構(gòu)中第一個成員p,這種聲明方式代表child_class類型的數(shù)據(jù)中開始的位置包含一個parent_class類型的變量。在函數(shù)func中obj是一個child_class對象,正像這個結(jié)構(gòu)類型指示的,它前面的數(shù)據(jù)應(yīng)該包含一個parent_class類型的數(shù)據(jù)。在第21行的強制類型賦值中parent_ptr指向了obj變量的首地址,也就是obj變量中的p對象。好了,現(xiàn)在parent_ptr指向的是
一個真真實實的parent類型的結(jié)構(gòu),那么可以按照parent的方式訪問其中的成員,當然也包括可以使用和parent結(jié)構(gòu)相關(guān)的函數(shù)來處理內(nèi)部數(shù)據(jù),因為一個正常的,正確的代碼,它是不會越界訪問parent結(jié)構(gòu)體以外的數(shù)據(jù)。經(jīng)過這基本的結(jié)構(gòu)體層層相套包含,對象簡單的繼存關(guān)系就體現(xiàn)出來了:父對象放于數(shù)據(jù)塊的最前方,代碼中可以通過強制類型轉(zhuǎn)換獲得父對象指針。

1.3  多態(tài)
對象根據(jù)所接收的消息而做出動作。同一消息為不同的對象接受時可產(chǎn)生完全不同的行動,這種現(xiàn)象稱為多態(tài)性。利用多態(tài)性用戶可發(fā)送一個通用的信息,而將所有的實現(xiàn)細節(jié)都留給接受消息的對象自行決定,如是,同一消息即可調(diào)用不同的方法。例如:抽象設(shè)備具備接口統(tǒng)一的讀寫接口。串口是設(shè)備的一種,也應(yīng)支持設(shè)備的讀寫。但串口的讀寫操作是串口所特有的,不應(yīng)和其他設(shè)備
操作完全相同,例如操作串口的操作不應(yīng)應(yīng)用于SD卡設(shè)備中。多態(tài)性的實現(xiàn)受到繼承性的支持,利用類繼承的層次關(guān)系,把具有通用功能的協(xié)議存放在類層次中盡可能高的地方,而將實現(xiàn)這一功能的不同方法置于較低層次,這樣,在這些低層次上生成的對象就能給通用消息以不同的響應(yīng)。

對象模型采用結(jié)構(gòu)封裝中使用指針的形式達到面向?qū)ο笾卸鄳B(tài)的效果,例如:

復制代碼 代碼如下:

/*  抽象父類  */
struct  parent_class
{
  int  a;

  /*  反映不同類別屬性的方法  */
  void  (*vfunc)(int  a);
}

/*  抽象類的方法調(diào)用  */
void  parent_class_vfunc(struct  parent_class  *self,  int  a)
{
  assert(self  !=  NULL);
  assert(slef->vfunc  !=  NULL);

  /*  調(diào)用對象本身的虛擬函數(shù)  */
  self->vfunc(a);
}

/*  繼承自parent class的子類  */
struct  child_class
{
  struct  parent_class  parent;
  int  b;
};

/*  子類的構(gòu)造函數(shù)  */
void  child_class_init(struct  child_class*  self)
{
  struct  parent_class*  parent;

  /*  強制類型轉(zhuǎn)換獲得父類指針  */
  parent  =  (struct  base_class*)  self;
  assert(parent  !=  NULL);

  /*  設(shè)置子類的虛擬函數(shù)  */
  parent->vfunc  =  child_class_vfunc;
}

/*  子類的虛擬函數(shù)實現(xiàn)  */
static  void   child class vfunc(struct  child class*self,  int  a)
{
  self->b  =  a  +  10;
}

復制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>

//接口
#ifndef Interface
#define Interface struct
#endif

//類
#ifndef Class
#define Class struct
#endif

//抽象形狀類
Class Shape;
typedef Class Shape shape;
//抽象形狀類的方法聲明
shape* Shape(int edges);
int shape_getEdges(shape *);
int shape_getArea(void);
void _Shape(shape *);

//三角形類
Class Triangle;
typedef Class Triangle triangle;
//三角形類的方法聲明
triangle * Triangle(int bottom, int height);
int triangle_getEdges(triangle *);
int triangle_getArea(triangle *);
void _Triangle(triangle *);

//矩形類
Class Rectangle;
typedef Class Rectangle rectangle;
//矩形類的方法聲明
rectangle * Rectangle(int bottom, int height);
int rectangle_getEdges(rectangle *);
int rectangle_getArea(rectangle *);
void _Rectangle(rectangle *);

//抽象形狀類實現(xiàn)
Class Shape
{
    int edges;
    int (*getEdges)(shape*);
    int (*getArea)(void);
};

//形狀類構(gòu)造函數(shù)
shape* Shape(int edges)
{
    shape * obj = (shape *) malloc(sizeof(shape));
    obj->edges = edges;
    obj->getEdges = shape_getEdges;
    obj->getArea = shape_getArea;
    return obj;
}

int shape_getEdges(shape* obj)
{
    return obj->edges;
}

int shape_getArea(void)
{
    return -1;
}

//形狀類析構(gòu)函數(shù)
void _Shape(shape * obj)
{
    if(obj == NULL)
        return;
    free(obj);
}

//三角形類實現(xiàn)
Class Triangle
{
    shape * super;
    int bottom;
    int height;
    int (*getEdges)(triangle *);
    int (*getArea)(triangle *);
};

//三角形類構(gòu)造函數(shù)
triangle * Triangle(int bottom, int height)
{
    triangle* obj = (triangle*) malloc(sizeof(triangle));
    //調(diào)用Shape構(gòu)造函數(shù)用于實現(xiàn)繼承
    obj->super = Shape(3);
    obj->bottom = bottom;
    obj->height = height;
    obj->getEdges = triangle_getEdges;
    obj->getArea = triangle_getArea;
    return obj;
}

int triangle_getEdges(triangle * obj)
{
    return obj->super->edges;
}

int triangle_getArea(triangle * obj)
{
    return (obj->bottom * obj->height) / 2;
}

//三角形類析構(gòu)函數(shù)
void _Triangle(triangle * triangle)
{
    _Shape(triangle->super);

    if(triangle == NULL)
    {
        return;
    }

    free(triangle);
}

//矩形類實現(xiàn)
Class Rectangle
{
    shape * super;
    int bottom;
    int height;
    int (*getEdges)(rectangle *);
    int (*getArea)(rectangle *);
};

//矩形類構(gòu)造函數(shù)
rectangle * Rectangle(int bottom, int height)
{
    rectangle * obj = (rectangle *)malloc(sizeof(rectangle));
    //調(diào)用Shape構(gòu)造函數(shù)用于實現(xiàn)繼承
    obj->super = Shape(4);
    obj->bottom = bottom;
    obj->height = height;
    obj->getEdges = rectangle_getEdges;
    obj->getArea = rectangle_getArea;
    return obj;
}

int rectangle_getEdges(rectangle * obj)
{
    return obj->super->edges;
}

int rectangle_getArea(rectangle * obj)
{
    return (obj->bottom * obj->height);
}

//矩形類析構(gòu)函數(shù)
void _Rectangle(rectangle * obj)
{
    _Shape(obj->super);
    if(obj == NULL)
    {
        return;
    }
    free(obj);
}

//測試
void main(){
    shape* shapeObj = Shape(0);
     printf("%d\n", shapeObj->getEdges(shapeObj));
    printf("%d\n", shapeObj->getArea());
    _Shape(shapeObj);

    triangle* triangleObj = Triangle(4, 5);
    printf("%d\n", triangleObj->getEdges(triangleObj));
    printf("%d\n", triangleObj->getArea(triangleObj));
    _Triangle(triangleObj);

    rectangle* rectangleObj = Rectangle(4, 5);
    printf("%d\n", rectangleObj->getEdges(rectangleObj));
    printf("%d\n", rectangleObj->getArea(rectangleObj));
    _Rectangle(rectangleObj);
}

相關(guān)文章

  • 淺析C++中static的一些用法

    淺析C++中static的一些用法

    static是靜止的,靜態(tài)的意思,那它有什么用呢,今天通過實例代碼講解下C++中static的一些用法,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • C語言中fopen()函數(shù)的使用方法示例詳解

    C語言中fopen()函數(shù)的使用方法示例詳解

    這篇文章主要介紹了C語言中fopen()函數(shù)的使用方法,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 一文詳解C++關(guān)鍵詞auto的用法

    一文詳解C++關(guān)鍵詞auto的用法

    在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它,在 C++11中,auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,本文將給大家詳細的介紹一下C++關(guān)鍵詞auto的用法,需要的朋友可以參考下
    2024-02-02
  • C++中關(guān)于互斥量的全面認知

    C++中關(guān)于互斥量的全面認知

    線程的主要優(yōu)勢在于,能夠通過全局變量來共享信息。不過,這種便捷的共享是有代價的:必須確保多個線程不會同時修改同一變量,或者某一線程不會讀取正由其他線程修改的變量。為了防止出現(xiàn)線程某甲試圖訪?問一共享變量時,線程某乙正在對其進行修改。引入了互斥量
    2022-05-05
  • C++中HTTP?代理服務(wù)器的設(shè)計與實現(xiàn)詳解

    C++中HTTP?代理服務(wù)器的設(shè)計與實現(xiàn)詳解

    代理服務(wù)器,即允許一個網(wǎng)絡(luò)終端(一般為客戶端)通過這個服務(wù)與另一?個網(wǎng)絡(luò)終端(一般為服務(wù)器)進行非直接的連接,下面我們就來看看如何使用C++設(shè)計與實現(xiàn)一個HTTP?代理服務(wù)器吧
    2024-01-01
  • 一文搞懂C++ 動態(tài)內(nèi)存

    一文搞懂C++ 動態(tài)內(nèi)存

    這篇文章主要介紹了C++ 動態(tài)內(nèi)存的的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • C++ sleep()和usleep()的區(qū)別

    C++ sleep()和usleep()的區(qū)別

    本文主要介紹了C++ sleep()和usleep()的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Qt圖形圖像開發(fā)曲線圖表模塊QChart庫縮放/平移詳細方法與實例

    Qt圖形圖像開發(fā)曲線圖表模塊QChart庫縮放/平移詳細方法與實例

    這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫縮放/平移詳細方法與實例,需要的朋友可以參考下
    2020-03-03
  • 詳解C++ STL中vector擴容機制

    詳解C++ STL中vector擴容機制

    vector是表示可以改變大小的數(shù)組的序列容器,就像數(shù)組一樣,vector對其元素使用連續(xù)的存儲位置,這篇文章將給大家詳細介紹C++ STL中vector擴容機制,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 基于Matlab實現(xiàn)抖音小游戲蘋果蛇

    基于Matlab實現(xiàn)抖音小游戲蘋果蛇

    最近抖音上蘋果蛇小游戲大火,為了證明MATLAB無所不能,咋能不跟風做一個?文中詳細講解了游戲的實現(xiàn)步驟,感興趣的小伙伴可以嘗試一下
    2022-06-06

最新評論

普洱| 黄龙县| 吉首市| 潼南县| 巴林左旗| 正定县| 桐城市| 南岸区| 博野县| 闸北区| 塘沽区| 阿城市| 宜兴市| 万年县| 赣州市| 缙云县| 吉林市| 敦化市| 健康| 襄垣县| 兴隆县| 康保县| 江北区| 万宁市| 鄱阳县| 和硕县| 普宁市| 吉水县| 台北县| 从化市| 乐清市| 鹿邑县| 静安区| 游戏| 塔河县| 沂南县| 集安市| 大埔县| 鄱阳县| 黄平县| 福泉市|