مفهوم الـ Interface
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 40 من 61.
حتى الآن، كانت البنى لدينا تخلط بين البيانات والسلوك معًا: اسم إلى جانب مؤشّر function، على سبيل المثال. ولكن ماذا لو احتوت بنية على مؤشرات function فقط؟ ينشئ هذا شيئًا قويًا: interface.
يحدد interface العمليات المتاحة دون تحديد كيفية عملها. إنه عقد ينص على أن "أي كائن ينفذ هذا الـ interface يجب أن يوفر هذه الـ functions."
typedef void (*LogFunc)(const char* message);
typedef struct {
LogFunc log;
} ILogger;تحتوي بنية ILogger على function pointer فقط. ولا تحتوي على أي بيانات خاصة بها. فهي تصف السلوك فحسب. وتُعد البادئة "I" اصطلاحًا شائعًا يشير إلى أن هذا interface.
أي كود يقبل ILogger لا يهتم بالمكان الذي تذهب إليه رسالة السجل. فقد تتم طباعتها في وحدة التحكم، أو كتابتها في ملف، أو إرسال البيانات عبر شبكة. يعرف المستدعي فقط أنه يستطيع استدعاء log:
void process(ILogger* logger, const char* msg) {
logger->log(msg); // نحن لا نعرف كيف يسجل
}هذا الفصل هو جوهر تعدد الأشكال. تعمل الدالة process مع أي تطبيق لـ logger. يمكنك تبديل السلوكيات دون تغيير شفرة الدالة. في الدرس التالي، ستنشئ تطبيقات ملموسة تفي بعقد interface هذا.
التحدي
سهللنبنِ interface باسم ICalculator: وهو struct يحتوي فقط على مؤشرات function، ويحدد العمليات التي يجب أن يدعمها أي حاسوب دون تحديد كيفية عملها.
ستُنشئ ملفين لتنظيم شفرتك:
calculator.h: Define interface هنا. Create نوع مؤشر function يسمىBinaryOpيأخذ اثنين منintمنparametersويعيدint. ثم عرّف struct باسمICalculatorيحتوي فقط على مؤشري function:operate(من النوعBinaryOp) وdescribe(مؤشر function لا يأخذ أيparametersولا يعيد شيئًا). هذا struct هو interface بحت. فهو لا يحتوي على بيانات، بل على السلوك فقط.main.c: أدرج ملف الترويسة ونفّذ functions ملموسة يمكنها تلبية interface:add: يعيد مجموع عددين صحيحينmultiply: يعيد product عددين صحيحينdescribe_add: يطبعAdditiondescribe_multiply: يطبعMultiplication
ICalculator، واربطه بناءً على الإدخال، واستخدمه لإجراء عملية حسابية.
سيستقبل برنامجك ثلاثة مدخلات: اثنان من integers وoperation code (1 للجمع، و2 للضرب).
Based على operation code، اربط ICalculator الخاص بك بالزوج appropriate من functions. ثم استدعِ describe من خلال interface لطباعة اسم العملية، وبعد ذلك استدعِ operate لحساب النتيجة وطباعتها.
ناتج المثال عندما تكون المدخلات 5 و3 و1:
Addition
8ناتج المثال عندما تكون المدخلات 4 و7 و2:
Multiplication
28الفكرة الأساسية هي أن struct ICalculator الخاص بك يعرّف عقدًا: أي كود يستخدمه know أنه يستطيع استدعاء describe وoperate، دون معرفة أي functions محددة تم ربطها. تذكّر استخدام include guards في ملف الترويسة الخاص بك.
جرّب بنفسك
#include <stdio.h>
#include "calculator.h"
// TODO: نفّذ دالة add
// تُرجع مجموع عددين صحيحين
// TODO: نفّذ دالة multiply
// تُرجع حاصل ضرب عددين صحيحين
// TODO: نفّذ دالة describe_add
// تطبع "Addition"
// TODO: نفّذ دالة describe_multiply
// Prints "Multiplication"
int main() {
int num1, num2, op_code;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op_code);
// TODO: أنشئ مثيلاً من ICalculator
// TODO: بناءً على op_code (1 لـ add، 2 لـ multiply)،
// اربط الحاسبة بالدوال المناسبة
// TODO: استدعِ describe عبر الواجهة
// TODO: استدعِ operate عبر الواجهة واطبع النتيجة
return 0;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب8تعدد الأشكال (Polymorphism)
مؤشرات الدوال في الـ Structsمحاكاة الـ Methodsمفهوم الـ Interfaceتنفيذ الـ Interfacesالتكرار متعدد الأشكالمراجعة: Greeter3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت