การจำลองแนวคิดเชิงวัตถุ (OOP) ในภาษา C: วิธีใช้ struct และ function pointer อย่างมืออาชีพ

1. บทนำ

ภาษา C ได้รับความนิยมในหมู่นักพัฒนาโปรแกรมจำนวนมากเนื่องจากประวัติศาสตร์ที่ยาวนานและความสามารถในการควบคุมระดับต่ำ อย่างไรก็ตาม ภาษา C ไม่ใช่ “ภาษาเชิงวัตถุ” หมายความว่าตัวภาษาเองไม่ได้รองรับฟีเจอร์เชิงวัตถุ (เช่น คลาส การสืบทอด การห่อหุ้มข้อมูล ฯลฯ) เหมือนกับ Java หรือ C++ อย่างไรก็ตาม เรายังสามารถจำลองแนวคิดเชิงวัตถุในภาษา C ได้ในระดับหนึ่ง บทความนี้จะอธิบายแนวคิดพื้นฐานของการเขียนโปรแกรมเชิงวัตถุในภาษา C เช่น การห่อหุ้มข้อมูล การสืบทอด และพหุรูปแบบ

2. แนวคิดพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ

การเขียนโปรแกรมเชิงวัตถุ (OOP) มีเป้าหมายในการจัดการข้อมูลและวิธีการดำเนินการกับข้อมูลนั้นไว้รวมกัน ช่วยให้โครงสร้างโปรแกรมชัดเจนมากขึ้น ส่งผลให้สามารถนำกลับมาใช้ซ้ำและดูแลรักษาได้ง่ายขึ้น แนวคิดหลักของ OOP คือ การห่อหุ้มข้อมูล การสืบทอด และพหุรูปแบบ ในภาษา C แม้จะไม่ได้รองรับโดยตรง แต่สามารถจำลองได้ด้วยวิธีที่เหมาะสม

2.1 การห่อหุ้มข้อมูล

การห่อหุ้มข้อมูลคือการรวมข้อมูลและวิธีการจัดการ (เมธอด) ไว้ในหนึ่งหน่วย พร้อมทั้งควบคุมการเข้าถึงจากภายนอก ในภาษา C สามารถใช้ struct เพื่อรวมข้อมูลได้ struct ทำหน้าที่คล้ายกับคลาสที่รวมข้อมูลหลายค่าเข้าไว้ด้วยกัน

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

ในโครงสร้างนี้ Person จะเก็บทั้งข้อมูลอายุและชื่อไว้ด้วยกันแบบห่อหุ้ม ช่วยให้สามารถสร้างอินสแตนซ์และจัดการข้อมูลได้ง่ายขึ้น

2.2 การสืบทอด (Inheritance)

ภาษา C ไม่มีแนวคิดเรื่องการสืบทอดแบบคลาสโดยตรง แต่สามารถจำลองกลไกนี้ได้ด้วยการฝัง struct หนึ่งไว้ในอีก struct หนึ่ง เพื่อให้มีคุณสมบัติคล้ายกับการสืบทอด

typedef struct {
    int age;
} Parent;

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

ในตัวอย่างนี้ struct Child จะมี struct Parent อยู่ภายใน ซึ่งเป็นการจำลองลักษณะการสืบทอด

2.3 พหุรูปแบบ (Polymorphism)

Polymorphism คือความสามารถที่คำสั่งเดียวกันทำงานต่างกันขึ้นกับชนิดของออบเจกต์ ในภาษา C สามารถใช้ตัวชี้ฟังก์ชัน (Function Pointer) เพื่อจำลองแนวคิดนี้ ตัวชี้ฟังก์ชันจะเก็บที่อยู่ของฟังก์ชันและเรียกใช้งานแบบไดนามิกได้

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;  // กำหนด pointer ไปที่ฟังก์ชัน add
printf("%d", op(3, 4));  // ผลลัพธ์: 7
op = multiply;            // เปลี่ยน pointer ไปที่ multiply
printf("%d", op(3, 4));   // ผลลัพธ์: 12

ด้วยวิธีนี้สามารถใช้ pointer เดียวเรียกใช้ฟังก์ชันต่าง ๆ ได้

侍エンジニア塾

3. วิธีจำลองคลาสในภาษา C

เพื่อให้ภาษา C รองรับแนวคิดเชิงวัตถุ จำเป็นต้องสร้างโครงสร้างคลาสขึ้นมาเอง โดยใช้ struct ผสมกับ function pointer เพื่อให้ได้โครงสร้างคล้ายคลาส

3.1 ใช้ struct แทนคลาส

การจำลองคลาสในภาษา C จะใช้ struct รวมทั้งข้อมูลและเมธอดเข้าด้วยกัน เมธอดจะนิยามเป็นฟังก์ชันและนำ function pointer มาเก็บใน struct

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

ตัวอย่างนี้ struct Person จะมีเมธอด setAge และ getAge ทำงานคล้ายคลาสในภาษา OOP

4. การทำเมธอดในภาษา C

เพื่อจำลองฟีเจอร์ “เมธอด” ของ OOP ในภาษา C จะใช้ function pointer โดยเก็บเป็นสมาชิกใน struct

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

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

5. สรุปและการประยุกต์ใช้

แม้ภาษา C จะไม่ได้รองรับแนวคิด OOP โดยตรง แต่สามารถประยุกต์ใช้ struct, function pointer และการจัดการหน่วยความจำเพื่อจำลองคลาสหรือการสืบทอดได้ในระดับหนึ่ง

侍エンジニア塾