تحميل الدوال الزائد
جزء من قسم 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)، حيث يتم اتخاذ القرار بشأن الدالة التي سيتم استدعاؤها عند تجميع الكود، وليس عند تشغيله.
التحدي
سهللنقم ببناء فئة حاسبة متعددة الاستخدامات توضح قوة التحميل الزائد للميثود (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)
باستخدام الحاسبة الخاصة بك، قم بإجراء هذه العمليات واطبع كل نتيجة في سطر خاص بها:
- اضرب أول عددين صحيحين (يستخدم إصدار two-int)
- اضرب جميع الأعداد الصحيحة الثلاثة (يستخدم إصدار three-int)
- اضرب العدد الصحيح الأول والرقم العشري (يستخدم إصدار two-double)
- وصف العدد الصحيح الأول (يستخدم إصدار int)
- وصف الرقم العشري (يستخدم إصدار 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 مع العدد العشري وطباعة النتيجة
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection