Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مفهوم الـ 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 هذا.

challenge icon

التحدي

سهل

لنبنِ 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: يطبع Addition
    • describe_multiply: يطبع Multiplication
    ثم أنشئ instance من 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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت