مضى على الشبكة و يوم من العطاء.

البرمجة الكائنية (Overloading)

Sadell_AliSadell_Ali is verified member.

الرقابة والتنظيم
.:: الرقابة والتنظيم ::.
.:: طاقم المشرفين ::.

السمعة:

موضوعنا لليوم هو ال Overloading و أختلافها عن ال Overriding , بسم الله نبدأ :
Overloading :تعني تعريف أكثر من عامل, دالة أو كونستركتور لهم نفس الاسم و لكنهم يختلفون في عدد أو نوع الباراميترات.
عند تعريف أكثر من كونستركتور لهم نفس الاسم يكون الهدف إنشاء كائن يكون له أكثر من طريقة متاحة لتمرير قيم أولية للخصائص الموجودة فيه وأيضاً عند تعريف أكثر من دالة لهم نفس الاسم يكون الهدف منهم إمكانية تنفيذ نفس العملية مع مراعاة عدد و أنواع القيم التي يتم تمريرها للدالة عند استدعائها, ويوجد ميزة جميلة جداً وهي => عند تعريف أكثر من عامل لهم نفس الرمز يكون الهدف تصغير حجم الكود عند التعامل مع الكائنات.

قبل معرفة شروط عمل الOverloading رح نلخص الفروقات أو الختلافات بين ال Overriding وال Overloading :


  • OverLoading
تتم بين أكثر من ميثود فى كلاس واحد و يكون لهما نفس الاسم والاختلاف بين الميثود و الأخرى يكون في "الباراميترات"
ال modifiers يعنى كونهم ,public , protected , private, default أو كما تشاء فى التنويع بينهم
وهي خاصية مفيدة جدًا كما تحدثنا سابقاً يمكنك ,مثلًا عمل دالة لها أكثر من وظيفة حسب البارامترات المدخلة .
  • Overriding
شبيهة بال overloading إلى حد ما إلا أنها :
  1. لا تحدث بين الدالتين فى كلاس واحد إنما بين كلاس و كلاس وارث منه.
  2. نفس البارامترات
  3. الاختلاف فى الmodifiers يكون مقنن حيث يمكنك التغيير (فى الكلاس الوارث) و لكن الmodifier صلاحيته أعلى (أقل تقييدًا) ويمكنك استخدام نفس ال modifier ولك أن تضيف static , synchronized,final أو غيرهم.
والتدريج من أعلى لأسفل كالتالي:
public 1
protected 2
default 3
ولا مجال للـ private هنا😊

وفي حال أنك قمت بأخذ object من الكلاس الوارث ونفذت الدالة من غير override سيتم تنفيذ دالة الكلاس الموروث منه إنما بتطبيق ال override يتم تنفيذ دالة الكلاس الوارث.
كلاس وارث = sub Class
كلاس موروث منه = Super Class


الآن فالنبدأ بالشروط:giggle:
الشرط الأول = يطبق فقط على العوامل, الدوال و الكونستركتورات
الشرط الثاني = يجب أن يملكوا نفس الاسم
الشرط الثالث = يجب أن يختلفوا في نوع أو عدد الباراميترات
الشرط الرابع = بالنسبة للدوال, نوع الإرجاع غير مهم لأن الcompiler لا يستطيع التفريق بين الدوال إذا كانوا مختلفين في نوع الإرجاع فقط

بعض الأمثلة لتوضيح عمل ال Overloading :
المثال الأول

كود:
#include <iostream>

using namespace std;

// فتقوم بطباعة ناتج جمعهما int عند استدعاءها نمرر لها قيمتين من النوع sum هنا قمنا بتعريف دالة إسمها
void sum(int a, int b)
{
    cout << "First method is called ====> " << a << " + " << b << " = " << (a+b) << endl;
}

// فتقوم بطباعة ناتج جمعهما double عند استدعاءها نمرر لها قيمتين من النوع sum هنا قمنا بتعريف دالة إسمها
void sum(double a, double b)
{
    cout << "Second method is called ===> " << a << " + " << b << " = " << (a+b) << endl;
}

// main() هنا قمنا بتعريف الدالة
int main()
{
    sum(4, 6);            // int هنا سيتم إستدعاء الدالة التي تأخذ 2 باراميتر نوعهم
    sum(2.3, 5.4);        // double هنا سيتم إستدعاء الدالة التي تأخذ 2 باراميتر نوعهم

    return 0;
}
في هذا المثال قمنا بتعريف دالتين اسمهما sum ونوعهما void و لكنهما مختلفتان عن بعضهما بأنواع الباراميترات , إي أنهما تمتلكان نفس الاسم وتختلفان بنوع الباراميترات:
الدالة الأولى مهمتها جمع أي عددين نوعهما int نمررهما لها عند استدعاءها ومن ثم طباعة الناتج
الدالة الثانية مهمتها جمع أي عددين نوعهما
float نمررهما لها عند استدعاءها ومن ثم طباعة الناتج

هذا هو الناتج👇 عند التشغيل

كود:
First method is called ====> 4 + 6 = 10 Second method is called ===> 2.3 + 5.4 = 7.7
كما نُلاحظ هنا, في كل مرة قمنا فيها باستدعاء الدالة sum() وجدنا أن الcompiler قام باستدعاء الدالة sum() المناسبة لنوع الباراميترات التي كنا نمرره لها
المثال الثاني
كود:
#include <iostream>

using namespace std;

// عند استدعاءها نمرر لها عددين فتقوم بطباعة ناتج جمعهما sum هنا قمنا بتعريف دالة إسمها
void sum(float a, float b)
{
    cout << a << " + " << b << " = " << (a + b) << endl;
}

// عند استدعاءها نمرر لها ثلاث أعداد فتقوم بطباعة ناتج جمعهم sum هنا قمنا بتعريف دالة إسمها
void sum(float a, float b, float c)
{
    cout << a << " + " << b << " + " << c << " = " << (a + b + c) << endl;
}

// main() هنا قمنا بتعريف الدالة
int main()
{
    sum(1, 3);        // التي تأخذ قيمتين sum() هنا سيتم إستدعاء الدالة
    sum(1, 3, 7);     // التي تأخذ ثلاث قيم sum() هنا سيتم إستدعاء الدالة

    return 0;
}
في المثال التالي قمنا بتعريف ثلاث دوال اسمهم sum و نوعهما void و لكنهم مختلفين عن بعضهم بعدد الباراميترات
الدالة الأولى مهمتها جمع أي عددين نمررهما لها عند استدعاءها و من ثم طباعة الناتج

الدالة الثانية مهمتها جمع أي ثلاث أعداد نمررها لها عند استدعاءها و من ثم طباعة الناتج

الناتج

كود:
1 + 3 = 4 1 + 3 + 7 = 11
وكما نلاحظ هنا , في كل مرة قمنا فيها باستدعاء الدالة sum() وجدنا أن المترجم قام باستدعاء الدالة sum() التي تحتوي على نفس عدد الباراميترات الذي كنا نمرره لها
المثال الثالث
الفكرة من هذا المثال هو تعريف دوال تعتمد على دوال تمتلك نفس الإسم
كود:
#include <iostream>

using namespace std;

// هذه الدالة تعطيها رقمين فترجع لك العدد الأكبر بينهما
double maximum(double a, double b)
{
    if(a>b)
        return a;
    else
        return b;
}

// هذه الدالة تعطيها ثلاثة أرقام فترجع لك العدد الأكبر بينهم
// و هي تعتمد على الدالة السابقة لمقارنة أول عددين مع العدد الثالث
double maximum(double a, double b, double c)
{
    if(maximum(a,b)>c)
        return maximum(a,b);
    else
        return c;
}

// هذه الدالة تعطيها ثلاثة أرقام فترجع لك العدد الأكبر بينهم
// و هي تعتمد على الدالتين السابقتين لمقارنة أول ثلاث أعداد مع العدد الرابع
double maximum(double a, double b, double c, double d)
{
    if(maximum(a,b,c)>d)
        return maximum(a,b,c);
    else
        return d;
}

// main() هنا قمنا بتعريف الدالة
int main()
{

    cout << "The maximum number is: " << maximum(5, 20) << endl;       // هنا سيتم إستدعاء الدالة التي تأخذ 2 باراميتر
    cout << "The maximum number is: " << maximum(5, 20, 15) << endl;   // هنا سيتم إستدعاء الدالة التي تأخذ 3 باراميترات
    cout << "The maximum number is: " << maximum(5, 20, 15, 30);       // هنا سيتم إستدعاء الدالة التي تأخذ 4 باراميترات

    return 0;
}

في المثال التالي قمنا بتعريف ثلاث دوال اسمهم maximum() و نوعهم double.
الدالة الأولى تأخذ 2 باراميتر عبارة عن أرقام, و هي تعطينا العدد الأكبر بينهما
الدالة الثانية تأخذ 3 باراميترات عبارة عن أرقام, و هي تعطينا العدد الأكبر بينهم

الدالة الثالثة تأخذ 4 باراميترات عبارة عن أرقام, و هي تعطينا العدد الأكبر بينهم

سنحصل على النتيجة التالية عند التشغيل

كود:
The maximum number is: 20 The maximum number is: 20 The maximum number is: 30

كما نلاحظ هنا, في كل مرة قمنا فيها باستدعاء الدالة maximum() وجدنا أن المترجم قام باستدعاء الدالة maximum() التي تحتوي على نفس عدد الباراميترات الذي كنا نمرره لها, و داخلياً ربطنا الدوال ببعضها

🌸يعطيكم العافية 🌸

دروس البرمجة الكائنية
 
التعديل الأخير بواسطة المشرف:
بنحتاج كثير اوقات نراجع الأساس الخاص فينا او نطوره يعطيكِ العافية يا رب
 
التعديل الأخير:

آخر المشاركات

عودة
أعلى