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

تحميل الدوال الزائد

جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 50 من 70.

تحميل الدوال الزائد (Method overloading) يتيح لك تعريف عدة دوال بنفس الاسم ولكن بقوائم معاملات مختلفة. يحدد المترجم (compiler) أي إصدار سيتم استدعاؤه بناءً على الوسائط (arguments) التي تقدمها.

يجب أن يكون لكل دالة محملة بشكل زائد (overloaded method) توقيع فريد - إما عدد مختلف من المعاملات أو أنواع معاملات مختلفة:

public static void Print(string message)
{
    Console.WriteLine(message);
}

public static void Print(string message, int times)
{
    for (int i = 0; i < times; i++)
        Console.WriteLine(message);
}

public static void Print(int number)
{
    Console.WriteLine(number);
}
// يختار المترجم الإصدار الصحيح
Print("Hello");           // يستدعي Print(string)
Print("Hi", 3);           // يستدعي Print(string, int)
Print(42);                // يستدعي Print(int)

يختلف التحميل الزائد (Overloading) عن المعاملات الاختيارية (optional parameters) بطريقة مهمة. فمع المعاملات الاختيارية، يكون لديك طريقة (method) واحدة تتعامل مع سيناريوهات متعددة. أما مع التحميل الزائد، فيكون لديك طرق منفصلة يمكن أن تحتوي على منطق مختلف تمامًا لكل حالة.

لاحظ أن نوع الإرجاع وحده لا يجعل الدوال فريدة - لا يمكنك الحصول على دالتين تختلفان فقط فيما ترجعانه. يجب أن تكون قائمة المعاملات مختلفة. يعد التحميل الزائد للدوال (Method overloading) شكلاً من أشكال تعدد الأشكال في وقت التجميع (compile-time polymorphism)، حيث يتم اتخاذ القرار بشأن الدالة التي سيتم استدعاؤها عند تجميع الكود، وليس عند تشغيله.

challenge icon

التحدي

سهل

لنقم ببناء فئة حاسبة متعددة الاستخدامات توضح قوة التحميل الزائد للميثود (method overloading). ستقوم بإنشاء إصدارات متعددة من ميثودز الحساب التي تتعامل مع سيناريوهات مختلفة - من العمليات البسيطة المكونة من رقمين إلى الحسابات الأكثر تعقيداً - وكلها تشترك في نفس أسماء الميثودز البديهية.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Calculator.cs: أنشئ فئة Calculator داخل مساحة الأسماء MathTools مع ميثودز محملة بشكل زائد (overloaded methods) تشترك في الأسماء ولكن تقبل معاملات مختلفة:
    • Multiply - أنشئ ثلاثة إصدارات محملة بشكل زائد:
      • إصدار يأخذ معاملين من نوع int ويعيد حاصل ضربهما كـ int
      • إصدار يأخذ ثلاثة معاملات من نوع int ويعيد حاصل ضربهم كـ int
      • إصدار يأخذ معاملين من نوع double ويعيد حاصل ضربهما كـ double
    • Describe - أنشئ إصدارين محملين بشكل زائد:
      • إصدار يأخذ int ويعيد "Integer: {value}"
      • إصدار يأخذ double ويعيد "Double: {value}"
  • Program.cs: في ملفك الرئيسي، أنشئ مثيلاً (instance) من Calculator ووضح كيف يختار المترجم (compiler) تلقائياً الميثود الصحيحة بناءً على الوسائط (arguments) التي تقدمها.

ستتلقى أربعة مدخلات:

  • العدد الصحيح الأول (مثلاً، 5)
  • العدد الصحيح الثاني (مثلاً، 4)
  • العدد الصحيح الثالث (مثلاً، 3)
  • رقم عشري (مثلاً، 2.5)

باستخدام الحاسبة الخاصة بك، قم بإجراء هذه العمليات واطبع كل نتيجة في سطر خاص بها:

  1. اضرب أول عددين صحيحين (يستخدم إصدار two-int)
  2. اضرب جميع الأعداد الصحيحة الثلاثة (يستخدم إصدار three-int)
  3. اضرب العدد الصحيح الأول والرقم العشري (يستخدم إصدار two-double)
  4. وصف العدد الصحيح الأول (يستخدم إصدار int)
  5. وصف الرقم العشري (يستخدم إصدار double)

على سبيل المثال، إذا كانت المدخلات هي 5، 4، 3، و 2.5، يجب أن يكون المخرج:

20
60
12.5
Integer: 5
Double: 2.5

لاحظ كيف تستدعي Multiply و Describe بأنواع وأعداد مختلفة من الوسائط، ومع ذلك يعرف المترجم بالضبط أي إصدار يستخدمه في كل مرة. هذا هو تعدد الأشكال في وقت التجميع (compile-time polymorphism) قيد التنفيذ - يحدث القرار عند تجميع الكود الخاص بك، وليس عند تشغيله!

ورقة مرجعية

يسمح لك التحميل الزائد للدوال (Method overloading) بتعريف عدة دوال بنفس الاسم ولكن بقوائم معاملات مختلفة. يحدد المترجم (compiler) أي نسخة سيتم استدعاؤها بناءً على الوسائط المقدمة.

يجب أن تمتلك كل دالة محملة بشكل زائد توقيعاً فريداً - إما عدداً مختلفاً من المعاملات أو أنواع معاملات مختلفة:

public static void Print(string message)
{
    Console.WriteLine(message);
}

public static void Print(string message, int times)
{
    for (int i = 0; i < times; i++)
        Console.WriteLine(message);
}

public static void Print(int number)
{
    Console.WriteLine(number);
}

// يختار المترجم النسخة الصحيحة
Print("Hello");           // يستدعي Print(string)
Print("Hi", 3);           // يستدعي Print(string, int)
Print(42);                // يستدعي Print(int)

نقاط رئيسية حول التحميل الزائد للدوال:

  • يختلف التحميل الزائد عن المعاملات الاختيارية - فمع التحميل الزائد، يكون لديك دوال منفصلة يمكن أن تحتوي على منطق برمجي مختلف تماماً لكل حالة
  • نوع الإرجاع وحده لا يجعل الدوال فريدة - يجب أن تكون قائمة المعاملات مختلفة
  • التحميل الزائد للدوال هو شكل من أشكال تعدد الأشكال في وقت التجميع (compile-time polymorphism)، حيث يتم اتخاذ القرار بشأن أي دالة سيتم استدعاؤها عند تجميع الكود، وليس عند تشغيله

جرّب بنفسك

using System;
using MathTools;

class Program
{
    public static void Main(string[] args)
    {
        // قراءة المدخلات
        int firstInt = Convert.ToInt32(Console.ReadLine());
        int secondInt = Convert.ToInt32(Console.ReadLine());
        int thirdInt = Convert.ToInt32(Console.ReadLine());
        double decimalNum = Convert.ToDouble(Console.ReadLine());

        // TODO: إنشاء مثيل (instance) من Calculator

        // TODO: استدعاء Multiply مع عددين صحيحين وطباعة النتيجة

        // TODO: استدعاء Multiply مع ثلاثة أعداد صحيحة وطباعة النتيجة

        // TODO: استدعاء Multiply مع العدد الصحيح الأول والعدد العشري، وطباعة النتيجة

        // TODO: استدعاء Describe مع العدد الصحيح الأول وطباعة النتيجة

        // TODO: استدعاء Describe مع العدد العشري وطباعة النتيجة
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming