
OOP คือ C — Object-Oriented Programming ในภาษา C
OOP ในภาษา C

OOP คือ C Object-Oriented Programming Encapsulation Inheritance Polymorphism Abstraction struct function pointer opaque vtable
| OOP Concept | C Implementation | C++ Equivalent |
|---|---|---|
| Class | struct + functions | class |
| Encapsulation | opaque pointer + getter/setter | private/public |
| Inheritance | struct embedding + cast | class : public Base |
| Polymorphism | function pointer in struct | virtual function |
| Constructor | create() function + malloc | constructor |
| Destructor | destroy() function + free | destructor |
Encapsulation
/* === Encapsulation in C === */
/* person.h - Public Interface */
/* typedef struct Person Person; // Opaque - ไม่เห็น member */
/* Person* person_create(const char* name, int age); */
/* void person_destroy(Person* p); */
/* const char* person_get_name(const Person* p); */
/* int person_get_age(const Person* p); */
/* void person_set_age(Person* p, int age); */
/* person.c - Private Implementation */
/* #include "person.h" */
/* #include <stdlib.h> */
/* #include <string.h> */
/* */
/* struct Person { // Private - เห็นเฉพาะใน .c */
/* char name[100]; */
/* int age; */
/* }; */
/* */
/* Person* person_create(const char* name, int age) { */
/* Person* p = malloc(sizeof(Person)); */
/* strncpy(p->name, name, 99); */
/* p->age = age; */
/* return p; */
/* } */
/* */
/* void person_destroy(Person* p) { free(p); } */
/* const char* person_get_name(const Person* p) { return p->name; } */
/* int person_get_age(const Person* p) { return p->age; } */
/* void person_set_age(Person* p, int age) { */
/* if (age > 0 && age < 200) p->age = age; // Validation */
/* } */
/* Usage: */
/* Person* p = person_create("สมชาย", 25); */
/* printf("Name: %s Age: %d\n", person_get_name(p), person_get_age(p)); */
/* person_set_age(p, 26); */
/* person_destroy(p); */
from dataclasses import dataclass
@dataclass
class OOPPattern:
concept: str
c_technique: str
header_file: str
source_file: str
patterns = [
OOPPattern("Encapsulation",
"Opaque Pointer (typedef struct X X;)",
"ประกาศ type + function prototype เท่านั้น",
"define struct member + implement function"),
OOPPattern("Private Members",
"struct member อยู่ใน .c file เท่านั้น",
"ผู้ใช้ไม่เห็น member ใน .h",
"เข้าถึง member ได้เฉพาะใน .c"),
OOPPattern("Getter/Setter",
"function รับ pointer + return/set value",
"const char* get_name(const X* x);",
"return x->name; x->age = age;"),
OOPPattern("Constructor",
"create() function + malloc + init",
"X* x_create(params);",
"malloc + set member + return pointer"),
OOPPattern("Destructor",
"destroy() function + free",
"void x_destroy(X* x);",
"free(x); // cleanup resources"),
]
print("=== Encapsulation Patterns ===")
for p in patterns:
print(f" [{p.concept}] {p.c_technique}")
print(f" .h: {p.header_file}")
print(f" .c: {p.source_file}")
Inheritance & Polymorphism

/* === Inheritance & Polymorphism in C === */
/* Base: Shape */
/* typedef struct Shape { */
/* int x, y; */
/* double (*area)(void* self); // Virtual function */
/* void (*draw)(void* self); // Virtual function */
/* void (*destroy)(void* self); // Virtual destructor */
/* } Shape; */
/* Derived: Circle */
/* typedef struct { */
/* Shape base; // MUST be first member (for casting) */
/* int radius; */
/* } Circle; */
/* */
/* double circle_area(void* self) { */
/* Circle* c = (Circle*)self; */
/* return 3.14159 * c->radius * c->radius; */
/* } */
/* */
/* Circle* circle_create(int x, int y, int r) { */
/* Circle* c = malloc(sizeof(Circle)); */
/* c->base.x = x; */
/* c->base.y = y; */
/* c->base.area = circle_area; // Set virtual function */
/* c->base.draw = circle_draw; */
/* c->base.destroy = circle_destroy; */
/* c->radius = r; */
/* return c; */
/* } */
/* Derived: Rectangle */
/* typedef struct { */
/* Shape base; */
/* int width, height; */
/* } Rectangle; */
/* */
/* double rect_area(void* self) { */
/* Rectangle* r = (Rectangle*)self; */
/* return r->width * r->height; */
/* } */
/* Polymorphism: */
/* Shape* shapes[3]; */
/* shapes[0] = (Shape*)circle_create(0, 0, 5); */
/* shapes[1] = (Shape*)rect_create(0, 0, 10, 20); */
/* shapes[2] = (Shape*)circle_create(5, 5, 3); */
/* */
/* for (int i = 0; i < 3; i++) { */
/* printf("Area: %.2f\n", shapes[i]->area(shapes[i])); */
/* shapes[i]->destroy(shapes[i]); // Virtual destructor */
/* } */
@dataclass
class InheritancePattern:
pattern: str
c_code: str
cpp_equivalent: str
note: str
inheritance = [
InheritancePattern("Base Class",
"typedef struct { int x; double (*method)(void*); } Base;",
"class Base { virtual double method() = 0; };",
"function pointer = virtual function"),
InheritancePattern("Derived Class",
"typedef struct { Base base; int extra; } Derived;",
"class Derived : public Base { int extra; };",
"base ต้องเป็น member ตัวแรก"),
InheritancePattern("Upcasting",
"Base* b = (Base*)&derived;",
"Base* b = &derived; // Implicit",
"C ต้อง cast explicit C++ implicit"),
InheritancePattern("Virtual Call",
"b->method(b); // Call through function pointer",
"b->method(); // Virtual dispatch",
"C ส่ง self เอง C++ ส่ง this อัตโนมัติ"),
InheritancePattern("Virtual Destructor",
"b->destroy(b); // function pointer",
"virtual ~Base() {}; delete b;",
"C ต้องเรียก destroy เอง C++ อัตโนมัติ"),
]
print("=== Inheritance Patterns ===")
for i in inheritance:
print(f" [{i.pattern}]")
print(f" C: {i.c_code}")
print(f" C++: {i.cpp_equivalent}")
print(f" Note: {i.note}")
Real-world Examples
# === Real-world OOP in C ===
@dataclass
class RealExample:
project: str
oop_usage: str
technique: str
example: str
examples = [
RealExample("Linux Kernel VFS",
"Virtual File System ใช้ OOP Pattern",
"struct file_operations มี function pointer (read write open close)",
"ext4 xfs btrfs implement file_operations ต่างกัน → Polymorphism"),
RealExample("GTK+ / GObject",
"GUI Framework เขียนด้วย C แบบ OOP เต็มรูปแบบ",
"GObject System: Inheritance Encapsulation Polymorphism Signal",
"GtkWidget → GtkContainer → GtkBox → GtkButton (Inheritance chain)"),
RealExample("SQLite",
"Database Engine ใช้ OOP Pattern สำหรับ VFS Backend",
"sqlite3_vfs struct มี function pointer สำหรับ File I/O",
"Custom VFS สำหรับ In-memory Encrypted Compressed Storage"),
RealExample("CPython",
"Python Interpreter เขียนด้วย C ใช้ OOP",
"PyObject base struct ทุก Python Object สืบทอดจาก PyObject",
"PyLongObject PyListObject PyDictObject ล้วนมี PyObject เป็น base"),
RealExample("Embedded Device Driver",
"Device Driver ใช้ OOP Pattern สำหรับ HAL",
"struct device_ops { init read write close } แต่ละ device implement ต่างกัน",
"UART SPI I2C Driver ใช้ struct เดียวกัน implement ต่างกัน"),
]
print("=== Real-world OOP in C ===")
for e in examples:
print(f"\n [{e.project}] {e.oop_usage}")
print(f" Technique: {e.technique}")
print(f" Example: {e.example}")
เคล็ดลับ
- Opaque: ใช้ Opaque Pointer ซ่อน struct member ใน .c file
- First Member: Base struct ต้องเป็น member ตัวแรกเสมอ สำหรับ Cast
- Self: ส่ง self pointer เป็น parameter ตัวแรกของทุก method
- Naming: ใช้ prefix ชื่อ struct ทุก function เช่น person_create circle_area
- Memory: อย่าลืม destroy/free ทุก object ที่ create C ไม่มี GC
OOP คืออะไร
Object-Oriented Programming Encapsulation Inheritance Polymorphism Abstraction struct function pointer C จำลอง OOP Linux GObject