C語言物件導向實踐:封裝、繼承與多型的實作方法

1. 介紹

C 語言因其歷史背景及對低層控制的能力,受到許多程式設計師的喜愛。然而,C 語言本身並不是「物件導向語言」。也就是說,與 Java 或 C++ 不同,C 語言並不直接支援物件導向的功能(如類別、繼承、封裝等)。不過,我們仍然可以在 C 語言中模擬物件導向程式設計的概念,並實現部分功能。本文將依序說明如何在 C 語言中實作物件導向程式設計,包括封裝、繼承與多型等基本概念。

2. 物件導向的基本概念

物件導向程式設計(OOP)的目的是將資料及其操作方式整合在一起管理。這樣可以讓程式結構更明確、提升重用性與維護性。物件導向的三大核心概念為封裝繼承以及多型。雖然 C 語言並未直接支援這些機制,但只要運用一些技巧,還是可以達到類似的效果。

2.1 封裝

封裝指的是將資料及其操作(方法)整合成一個單位,並控制外部對其的存取。在 C 語言中,可以使用結構(struct)來將資料封裝在一起。結構體類似於類別,可將多個資料項目集中管理。

typedef struct {
    int age;
    char name[50];
} Person;

在這個結構體中,Person 型別將年齡和姓名等資訊封裝在一起。這樣便可建立 Person 的實例,並進行操作。

2.2 繼承

C 語言本身沒有繼承的概念,因此無法像類別一樣建立父子關係。但可以藉由結構體嵌入另一個結構體,達到類似繼承的效果。

typedef struct {
    int age;
} Parent;

typedef struct {
    Parent parent;
    int studentID;
} Child;

在這段程式碼中,Child 結構體內含 Parent 結構體,實現了類似繼承的設計。

2.3 多型(Polymorphism)

多型指的是相同的操作可以作用於不同型態的物件並產生不同行為。在 C 語言中,可以利用函式指標來實現多型。函式指標可儲存函式位址,並可動態呼叫不同函式。

typedef int (*OperationFunc)(int, int);

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

OperationFunc op = add;  // 設定為 add 函式
printf("%d", op(3, 4));  // 結果:7
op = multiply;            // 切換成 multiply 函式
printf("%d", op(3, 4));   // 結果:12

透過這種方式,可以用相同的函式指標呼叫不同的處理邏輯。

年収訴求

3. 在 C 語言中實作類別的方法

若要在 C 語言中實現物件導向程式設計,必須仿造「類別」的概念,結合結構體和函式指標來建立類似類別的架構。

3.1 以結構體模擬類別

想要在 C 語言實現類別,可將結構體用來整合資料與方法。方法以函式定義,並以函式指標形式存放於結構體內。

typedef struct {
    int age;
    void (*setAge)(struct Person*, int);
    int (*getAge)(struct Person*);
} Person;

void setAge(struct Person* p, int age) {
    p->age = age;
}

int getAge(struct Person* p) {
    return p->age;
}

Person person = {0, setAge, getAge};
person.setAge(&person, 25);
printf("Age: %d", person.getAge(&person));  // 結果:25

上述程式碼中,Person 結構體擁有 setAgegetAge 方法,運作方式接近類別。

4. 方法的實現

若要在 C 語言中實現「方法」這一物件導向特徵,可利用函式指標,將方法定義為結構體的成員。

typedef struct {
    int age;
    void (*setAge)(struct Person*, int);
} Person;

void setAge(struct Person* p, int age) {
    p->age = age;
}

5. 總結與應用

雖然 C 語言可以實現物件導向設計,但因為語言本身不直接支援,需要做一些巧妙的設計。善用結構體、函式指標與記憶體管理,可以在 C 語言中模擬類別和繼承等概念。