1. المقدمة
لغة البرمجة C تحظى بشعبية كبيرة بين المبرمجين بفضل تاريخها وإمكانياتها في التحكم المنخفض المستوى. ومع ذلك، لغة C ليست “لغة كائنية التوجه” بشكل افتراضي، أي أنها لا تدعم ميزات البرمجة الكائنية مثل الفئات (Classes)، الوراثة، أو التغليف مثل Java أو ++C. ومع ذلك، من الممكن تقليد مفاهيم البرمجة الكائنية وتحقيق بعض هذه الميزات باستخدام لغة C. في هذا المقال، سنشرح كيف يمكن تطبيق البرمجة الكائنية في C من خلال استعراض أساسيات مثل التغليف، الوراثة، والتعددية الشكلية (Polymorphism).
2. أساسيات البرمجة الكائنية
البرمجة الكائنية (OOP) تهدف إلى إدارة البيانات وطرق التعامل معها كوحدة واحدة. هذا يجعل هيكلية البرنامج أكثر وضوحًا ويزيد من قابلية إعادة الاستخدام والصيانة. من أهم مفاهيم البرمجة الكائنية: التغليف، الوراثة، والتعددية الشكلية. لا تدعم لغة C هذه الميزات بشكل مباشر، ولكن يمكن تحقيقها بطرق إبداعية.
2.1 التغليف
التغليف يعني جمع البيانات والوظائف (الدوال) التي تتعامل معها كوحدة واحدة مع التحكم في الوصول من الخارج. في C، يمكن استخدام الهياكل (Structs) لجمع البيانات معًا. تلعب الهياكل دورًا مشابهًا للفئات في لغات أخرى، حيث تجمع أنواع بيانات متعددة في وحدة واحدة.
typedef struct {
int age;
char name[50];
} Person;
في هذا الهيكل، قمنا بتغليف معلومات العمر والاسم في نوع البيانات Person
. هذا يسمح بإنشاء مثيلات (Instances) من Person
والتعامل معها.
2.2 الوراثة
لا توفر لغة C مفهوم الوراثة بشكل مباشر، فلا يمكنك إنشاء علاقات أبوية مباشرة بين الهياكل كما هو الحال في الفئات. لكن يمكن محاكاة الوراثة عبر تضمين هيكل داخل هيكل آخر كعضو.
typedef struct {
int age;
} Parent;
typedef struct {
Parent parent;
int studentID;
} Child;
في هذا المثال، Child
يحتوي على Parent
كعضو، وهو ما يمثل شكلاً من أشكال الوراثة البرمجية في C.
2.3 التعددية الشكلية (Polymorphism)
التعددية الشكلية تعني أن نفس العملية يمكن أن تعمل بطرق مختلفة حسب نوع الكائن. في لغة C، يمكن تحقيق ذلك باستخدام مؤشرات الدوال (Function Pointers)، وهي متغيرات تخزن عنوان دالة ما وتسمح باستدعاء دوال مختلفة بشكل ديناميكي.
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; // تعيين المؤشر إلى دالة الجمع
printf("%d", op(3, 4)); // النتيجة: 7
op = multiply; // تغيير المؤشر إلى دالة الضرب
printf("%d", op(3, 4)); // النتيجة: 12
بهذه الطريقة، يمكن استخدام نفس مؤشر الدالة لاستدعاء عمليات مختلفة.

3. كيفية تنفيذ الفئات في لغة C
لتنفيذ البرمجة الكائنية في C، يجب إنشاء مفهوم الفئة بشكل افتراضي. لذلك نستخدم الهياكل مع مؤشرات الدوال لمحاكاة الفئات وتقريبها من البرمجة الكائنية.
3.1 استخدام الهيكل كفئة
يمكن تحقيق الفئة عبر استخدام هيكل يجمع البيانات مع الدوال كأعضاء عبر مؤشرات الدوال. يتم تعريف الدوال بشكل مستقل ثم ربطها بالهيكل من خلال المؤشرات.
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
يحتوي على دوال setAge
وgetAge
كمؤشرات، ويعمل بطريقة مشابهة للفئة.
4. تنفيذ الدوال (Methods)
يمكن محاكاة “الدوال” في البرمجة الكائنية بلغة C باستخدام مؤشرات الدوال داخل الهياكل، بحيث يتم تعريفها كمتغيرات عضو للهيكل.
typedef struct {
int age;
void (*setAge)(struct Person*, int);
} Person;
void setAge(struct Person* p, int age) {
p->age = age;
}
5. الخلاصة والتطبيقات
من الممكن تطبيق البرمجة الكائنية في C باستخدام الهياكل ومؤشرات الدوال وإدارة الذاكرة. لكن بما أن اللغة لا تدعم هذه الميزات بشكل مباشر، يجب استخدام بعض الحيل البرمجية لتحقيق نفس المفاهيم مثل الفئات والوراثة.