首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言實現面向對象:封裝、多態與依賴倒置實戰

     編輯:關於C

設計初衷

面向對象的核心——封裝、繼承、多態——本質是軟件工程管理複雜性的思想,不依賴特定語言。在C中通過不透明指針+函數指針表可實現接口與實現分離,達到「依賴抽象而非具體」的設計目標。

架構分層

/* shape.h —— 抽象接口層 */
typedef struct shape_t {
    void *shapeData;          // 私有數據(不透明指針)
    void (*area)(void *);     // 計算面積
    void (*release)(void *);  // 釋放資源
} Shape;

/* circle.h —— 具體類型聲明 */
typedef struct { double r; } CircleData; // 私有數據結構

typedef struct {
    void *shapeData;
    void (*area)(void *);
    void (*release)(void *);
} Circle;

Circle *makeCircle(double r); // 工廠函數

實現細節:信息隱藏與多態

/*** circle.c —— 具體實現 ***/
static void area(void *shape) {
    Circle *c = (Circle *)shape;
    CircleData *d = (CircleData *)c->shapeData;
    printf("circle area: %f\n", d->r * d->r * 3.14159);
}

static void release(void *shape) {
    Circle *c = (Circle *)shape;
    free(c->shapeData);
    free(c);
}

Circle *makeCircle(double r) {
    CircleData *d = malloc(sizeof(CircleData));
    Circle *c = malloc(sizeof(Circle));
    d->r = r;
    c->shapeData = d;
    c->area = area;
    c->release = release;
    return c;
}

關鍵點:

  • static修飾內部函數,實現私有方法
  • 數據結構CircleData僅在.c文件中定義,外部不可見(封裝)
  • 工廠函數動態綁定函數指針,構建虛函數表

客戶端代碼:面向接口編程

void printShapeArea(Shape **shapes, int n) {
    for (int i = 0; i < n; ++i) {
        shapes[i]->area(shapes[i]);   // 多態調用
        shapes[i]->release(shapes[i]); // 統一釋放
    }
}

int main() {
    Shape *list[3] = {
        (Shape *)makeCircle(3.2),
        (Shape *)makeCircle(1.5),
        (Shape *)makeSquare(3.1, 4.0)
    };
    printShapeArea(list, 3); // 無需知曉具體類型
    return 0;
}

擴展性驗證:新增三角形零修改客戶端

只需提供triangle.h/.c實現同樣接口,printShapeArea完全不變。這正是開閉原則在C語言中的體現。

總結

OO概念C語言映射
類結構體 + 函數指針表
封裝不透明指針 + 內部靜態函數
繼承結構體嵌套(組合優於繼承)
多態統一接口簽名 + 運行時函數指針綁定
構造/析構工廠函數 / release回調
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved