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 และการจัดการหน่วยความจำเพื่อจำลองคลาสหรือการสืบทอดได้ในระดับหนึ่ง