<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學(xué)習(xí)的點點滴滴。

    c_socket.io_server筆記之定義私有接口

    有些話說

    頭文件可以作為接口定義,再加上static修飾符,就很容易定義私有的接口,每一個具體的實現(xiàn),即所有包含所有私有接口的頭文件,都必須要完整實現(xiàn)所有已聲明但未實現(xiàn)的函數(shù),否則gcc編譯不過去。廢話不多說,進入步驟吧。

    開始實施

    以毫無用處的blog為例,簡單兩個方法就行了,需要每一個實現(xiàn)暴露一個可以外部調(diào)用函數(shù)。

    定義一個結(jié)構(gòu),公用

    blog.h:

        #ifndef _BLOG_H
        
    #define _BLOG_H
        
        typedef 
    struct {
            
    char *name;
            
    void (*init)(void);
            
    void (*welcome)(void);
        } blog_t;
        
        
    #endif

    這個頭文件定義了一個對象。可以自由的被包含,包含之后自由使用blog_t結(jié)構(gòu)。

    定義一個完全私有函數(shù)頭文件

    blog_impl.h:

    #ifndef _BLOG_IMPL_H
    #define _BLOG_IMPL_H

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

    #include 
    "blog.h" //繼承blog.h文件

    static void welcome(void);
    static void init(void);

    static blog_t *gen_default(char *name) {
        blog_t 
    *blog = (blog_t *)malloc(sizeof(blog_t));
        blog
    ->name = strdup(name);
        blog
    ->init = init;
        blog
    ->welcome = welcome;

        
    return blog;
    }

    #endif

    這個文件聲明定義了若干static屬性的函數(shù),因此,只要包含此頭文件的C源文件,必須實現(xiàn)welcomeinit函數(shù),否則gcc編譯不通過。需要注意此頭文件私有。

    編寫實現(xiàn)

    blog1.c,僅僅一個實現(xiàn):

    #include "blog_impl.h"

    static blog_t *this;

    static void init(void){
        printf(
    "the blog owner is %s\n"this->name);
    }

    static void welcome(void){
        printf(
    "here is the %s haha !\n"this->name);
    }

    blog_t 
    *gen_blog1_ptr(){
        blog_t 
    *blog = gen_default("blog1");
        
    this = blog;

        
    return blog;
    }

    僅有一個對外入口:gen_blog1_ptr,也就是此實現(xiàn)對外唯一的交互方式。

    blog2.c,默認的實現(xiàn):

    #include "blog_impl.h"

    static void init(void){
        printf(
    "Here is the default blog init action !\n");
    }

    static void welcome(void){
        printf(
    "The system's welcome action !\n");
    }

    blog_t 
    *gen_blog2_ptr(){
        blog_t 
    *blog = gen_default("default");

        
    return blog;
    }

    此文件對外唯一入口為:gen_blog2_ptr

    其實兩個實現(xiàn)已經(jīng)可以了,但多一個說明接口單一,實現(xiàn)多樣性,再說錦上添花也是人們喜歡做的事情。 blog3.c,添花版:

    #include "blog_impl.h"

    static blog_t *this;

    static void init(void){
        printf(
    "Hi, %s\n"this->name);
    }

    static void welcome(void){
        printf(
    "you are welcome %s!\n"this->name);
    }

    blog_t 
    *gen_blog3_ptr(){
        blog_t 
    *blog = gen_default("blog3");
        
    this = blog;

        
    return blog;
    }

    一樣可以看到類似約定好的對外函數(shù)名稱gen_blog3_ptr

    應(yīng)用端實現(xiàn)

    我們以app.c作為應(yīng)用入口:

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

    #include 
    "blog.h"

    int main(int argc, char const *argv[]) {
        blog_t 
    *blog1 = gen_blog1_ptr();
        blog_t 
    *blog2 = gen_blog2_ptr();
        blog_t 
    *blog3 = gen_blog3_ptr();

        printf(
    "the blog1's actions \n");
        blog1
    ->init();
        blog1
    ->welcome();
        printf(
    "\n");

        printf(
    "the blog2's actions \n");
        blog2
    ->init();
        blog2
    ->welcome();
        printf(
    "\n");

        printf(
    "the blog3's actions \n");
        blog3
    ->init();
        blog3
    ->welcome();
        printf(
    "\n");

        
    return 0;
    }

    這里分別調(diào)用blog1.c, blog2.c, blog3.c,唯一入口,執(zhí)行簡單的邏輯。

    編譯運行

    編譯命令行代碼很簡單:

    gcc -o app app.c blog1.c blog2.c blog3.c

    運行:

    ./app

    運行效果:

    the blog1's actions ...
    the blog owner is blog1
    here is the blog1 haha !

    the blog2's actions ... Here is the default blog init action !
    The system's welcome action !

    the blog3's actions ...
    Hi, blog3
    you are welcome blog3!

    小結(jié)

    這里借助兩個頭文件,模擬了私有接口,公有結(jié)構(gòu)體對象,三個具體子類實現(xiàn)。
    c_socket.io_server項目中,作用于具體的實現(xiàn),以及定義了傳輸通道模型和實現(xiàn),互相不干擾。
    當(dāng)然和JAVA相比,模擬對象程度稍低了一些,但夠用了。這個世界不僅僅只有面向?qū)ο螅€有面向并發(fā)的函數(shù)式Erlang,還有面向軟件工程的大型語言Go。嗯,面向?qū)ο蟛贿^是這個世界其中一角,天生存在缺陷,也不是被所有人喜歡。組件公用、庫的概念,倒是大部分語言都很自然的欣然接受。面向過程,面向?qū)ο螅贿^是大部分人給與的標(biāo)簽,怎么用才重要。

    posted on 2013-03-29 17:18 nieyong 閱讀(1542) 評論(0)  編輯  收藏 所屬分類: socket.io

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2013年3月>
    242526272812
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲综合激情视频| 韩国二级毛片免费播放| a级男女仿爱免费视频| 国产免费久久精品99久久| 久久综合给合久久国产免费| 久久久久久久免费视频| 亚洲 无码 在线 专区| 亚洲视频.com| 亚洲午夜福利在线视频| 一本岛v免费不卡一二三区| 久久九九AV免费精品| 波多野结衣久久高清免费| 亚洲欧洲AV无码专区| 国产免费爽爽视频在线观看| 日本免费v片一二三区| 亚洲成AV人在线播放无码| 国产亚洲sss在线播放| 久久久精品视频免费观看| 亚洲AV午夜成人片| 国产高潮久久免费观看| 日韩高清在线免费观看| 免费看内射乌克兰女| 女人18毛片水真多免费播放| 亚洲av无码片在线播放| 亚洲免费二区三区| a级亚洲片精品久久久久久久| 激情综合亚洲色婷婷五月| 免费在线中文日本| 亚洲最新中文字幕| 久久久久久久99精品免费观看| 亚洲美女视频一区| 亚洲成人免费在线| 亚洲精品一品区二品区三品区| 看Aⅴ免费毛片手机播放| 免费无码A片一区二三区| 亚洲毛片免费视频| 国产成人涩涩涩视频在线观看免费| 亚洲va成无码人在线观看| 四虎影视精品永久免费| 亚洲av永久无码天堂网| 久久免费香蕉视频|