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

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

Sadell_AliSadell_Ali is verified member.

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

السمعة:

بسم الله الرحمن الرحيم

سوف نتحدث اليوم في هذا الدرس عن مفهوم الوراثة (Inheritance) والتي تعد من أهم المفاهيم التي تسمح للمطورين بإنشاء هيكلية للبرامج والتي بدورها تعتمد على العلاقات بين الكائنات
سيتم الشرح بشكل مبسط لمفهوم وأنواع الوراثة بإذن الله فالنبدأ 😊
في البداية ماذا تعني كلمة الوراثة (Inheritance) ؟
◀️ كلمة وراثة تعني تضمين محتوى كلاس في كلاس آخر إي أنه يمكن لِكلاس أن يرث من كلاس آخر حتى يحصل على الدوال و المتغيرات الموجودة في
إذاً فالفكرة من الوراثة أنه إذا كنت تريد إنشاء كلاس جديد و لاحظت أنه يوجد كلاس جاهز يحتوي على كودات قد تفيدك يمكنك استغلالها بكل بساطة بدلاً من كتابتها من الصفر, أي يمكنك جعل الكلاس الذي قمت بتعريفه يرث هذا الكلاس, و بعدها يمكنك إستخدام جميع المتغيرات و الدوال التي ورثها الكلاس الجديد من الكلاس الجاهز

سنتحدث الأن عن مصطلحات لابد من معرفتها قبل البدء وهي =>
1️⃣
الكلاس الذي يرث من كلاس آخر يقال له الكلاس الإبن, و يسمى Sub class و يقال له أيضاً ( Derived Class, Extended Class أو Child Class )
2️⃣ الكلاس الذي يورّث محتوياته لكلاس آخر يسمى الكلاس الأب, و يسمى Super class و يقال له أيضاً ( Base Class أو Parent Class)

يوجد أشكال للوراثة في لغة ال ++ C وهي أربع أشكال
الشكل الأول ⬅️
الوراثة الفردية: تعني كلاس يرث من كلاس واحد فقط
الشكل الثاني ⬅️
وراثة متتالية: تعني كلاس يرث من كلاس واحد و هذا الكلاس كان في الأصل يرث من كلاس آخر
الشكل الثالث ⬅️
وراثة هرمية: تعني أن الكلاس موروث من قبل أكثر من كلاس
الشكل الرابع ⬅️
وراثة متعددة: تعني أن الكلاس يرث من أكثر من كلاس
صورة لتوضيح أشكال الوراثة
1711202732758.png

1711202802949.png
والأن لجعل كلاس يرث من كلاس أخر نتبع الأسلوب التالي
كود:
class derived-class : access-specifier base-class
{

}
derived-class: يقصد بها إسم الكلاس الإبن
base-class: يقصد بها إسم الكلاس الأب
access-specifier: يقصد بها تحديد كيف يمكن الوصول للأشياء التي تم تضمينها في الكلاس الأب في الكلاس الإبن
إذاً لجعل الكلاس يرث من كلاس آخر نضع بعد إسم الكلاس نقطتين فوق بعض, ثم إسم الكلاس الذي نريده أن يرث منه و
مكان الكلمة access-specifier يمكنك وضع public أو private أو protected أو عدم وضع أي كلمة منهم و بذلك سيتم إعتبار أنك وضعت الكلمة private
فعندما تجعل الكلاس يرث من كلاس آخر يمكنك استخدام إحدى كلمات الوصول (Access Specifier ) لتحدد كيف يمكن الوصول للأشياء التي ورثها الكلاس الإبن من الكلاس الأب
حيث إن الكلمة public تستخدم لتحديد أن الأشياء التي سيرثها الكلاس الإبن من الكلاس الأب سيكون الوصول لها ممكناً من أي مكان
مثال: class B : public A
هنا أي شيء يرثه الكلاس B من الكلاس A سيتم إعتبار كأنه تم تعريفه public في الكلاس B
أما الكلمة private تستخدم لتحديد أن الأشياء التي سيرثها الكلاس الإبن من الكلاس الأب يمكن الوصول لها من نفس الكلاس فقط
مثال: class B : private A
هنا أي شيء يرثه الكلاس B من الكلاس A سيتم إعتبار كأنه تم تعريفه private في الكلاس B
وأخيراً الكلمة protected تستخدم لتحديد أن الأشياء التي سيرثها الكلاس الإبن من الكلاس الأب يمكن الوصول لها من نفس الكلاس و من أي كلاس آخر يرثها
مثال: class B : protected A
هنا أي شيء يرثه الكلاس B من الكلاس A سيتم إعتبار كأنه تم تعريفه protected في الكلاس B

أمثلة عن الوراثة
المثال الأول سيكون عن الوراثة الفردية
كود:
#include <iostream>

using namespace std;

// printMessage و دالة إسمها x يحتوي على متغير إسمه A هنا قمنا بتعريف كلاس إسمه
class A {
 
    public:
        int x = 10;
 
        void printMessage()
        {
            cout << "Hello from class A \n";
        }

};

// y و يحتوي على متغير إسمه A يرث من الكلاس B هنا قمنا بتعريف كلاس إسمه
class B: public A {

    public:
        int y = 20;
 
};

// main() هنا قمنا بتعريف الدالة
int main()
{
    // b إسمه B هنا قمنا بإنشاء كائن من الكلاس
    B b;
 
    // B و الذي تم تعريفه في الكلاس b الموجود في الكائن y هنا قمنا بطباعة قيمة المتغير
    cout << "y = " << b.y << "\n";
 
    // A من الكلاس B  و الذي ورثه الكلاس b الموجود في الكائن x هنا قمنا بطباعة قيمة المتغير
    cout << "x = " << b.x << "\n";
 
    // A من الكلاس B و التي ورثها الكلاس b الموجودة في الكائن printMessage() هنا قمنا باستدعاء الدالة
    b.printMessage();

    return 0;
}
في هذا المثال قمنا بتعريف كلاس إسمه A يحتوي على متغير إسمه x و دالة إسمها printMessage().
بعدها قمنا بإنشاء كلاس إسمه B يحتوي على متغير إسمه y و يرث من الكلاس A
إذا فالكلاس B هو ال derived-class
والكلاس A هو ال base-class
سيكون ناتج الكود هو التالي :
كود:
y = 20
x = 10

Hello from class A

المثال الثاني عن الوراثة المُتتالية
كود:
#include <iostream>

using namespace std;

// printA يحتوي على دالة إسمها A هنا قمنا بتعريف كلاس إسمه
class A {
 
    public:
        void printA()
        {
            cout << "Hello from class A \n";
        }

};

// printB و يحتوي على دالة إسمها A يرث من الكلاس B هنا قمنا بتعريف كلاس إسمه
class B: public A {

    public:
        void printB()
        {
            cout << "Hello from class B \n";
        }
 
};

// printC و يحتوي على دالة إسمها B يرث من الكلاس C هنا قمنا بتعريف كلاس إسمه
class C: public B {

    public:
        void printC()
        {
            cout << "Hello from class C \n";
        }
 
};

// main() هنا قمنا بتعريف الدالة
int main()
{
    // c إسمه C هنا قمنا بإنشاء كائن من الكلاس
    C c;
 
    // c هنا قمنا باستدعاء جميع الدوال الموجودة في الكائن
    c.printA();
    c.printB();
    c.printC();

    return 0;
}
في هذا المثال قمنا بتعريف كلاس إسمه A يحتوي على دالة إسمها printA().
بعدها قمنا بإنشاء كلاس إسمهB يحتوي على دالة إسمها printB() و يرث من الكلاس A
بعدها قمنا بإنشاء كلاس إسمه C يحتوي على دالة إسمها printC() و يرث من الكلاس B
صورة لتوضيح مَن ورث مِن مَن
1711205344998.png

ناتج الكود
كود:
Hello from class A
Hello from class B
Hello from class C
المثال الثالث وهو عن الوراثة المتعددة
كود:
#include <iostream>

using namespace std;

// printA يحتوي على دالة إسمها A هنا قمنا بتعريف كلاس إسمه
class A {
 
    public:
        void printA()
        {
            cout << "Hello from class A \n";
        }

};

// printB يحتوي على دالة إسمها B هنا قمنا بتعريف كلاس إسمه
class B {

    public:
        void printB()
        {
            cout << "Hello from class B \n";
        }
 
};

// printC و يحتوي على دالة إسمها B و يرث من الكلاس A يرث من الكلاس C هنا قمنا بتعريف كلاس إسمه
class C: public A, public B {

    public:
        void printC()
        {
            cout << "Hello from class C \n";
        }
 
};

// main() هنا قمنا بتعريف الدالة
int main()
{
    // c إسمه C هنا قمنا بإنشاء كائن من الكلاس
    C c;
 
    // c هنا قمنا باستدعاء جميع الدوال الموجودة في الكائن
    c.printA();
    c.printB();
    c.printC();

    return 0;
}
في هذا المثال قمنا بتعريف كلاس إسمه A يحتوي على دالة إسمها printA()
بعدها قمنا بإنشاء كلاس إسمه B يحتوي على دالة إسمها printB()
بعدها قمنا بإنشاء كلاس إسمه C يحتوي على دالة إسمها printC() و يرث من الكلاس A و الكلاس B
سنحصل على النتيجة التالية
كود:
Hello from class A
Hello from class B
Hello from class C
المثال الأخير عن الوراثة الهرمية
كود:
#include <iostream>

using namespace std;

// printA يحتوي على دالة إسمها A هنا قمنا بتعريف كلاس إسمه
class A {
 
    public:
        void printA()
        {
            cout << "Hello from class A \n";
        }

};

// printB و يحتوي على دالة إسمها A يرث من الكلاس B هنا قمنا بتعريف كلاس إسمه
class B : public A {

    public:
        void printB()
        {
            cout << "Hello from class B \n";
        }
 
};

// printC و يحتوي على دالة إسمها A يرث من الكلاس C هنا قمنا بتعريف كلاس إسمه
class C: public A {

    public:
        void printC()
        {
            cout << "Hello from class C \n";
        }
 
};

// main() هنا قمنا بتعريف الدالة
int main()
{
    // و استدعاء جميع الدوال الموجودة فيه b إسمه B هنا قمنا بإنشاء كائن من الكلاس
    B b;
    b.printA();
    b.printB();
    
    // و استدعاء جميع الدوال الموجودة فيه c إسمه C هنا قمنا بإنشاء كائن من الكلاس
    C c;
    c.printA();
    c.printC();

    return 0;
}
في هذا المثال قمنا بتعريف كلاس إسمه A يحتوي على دالة إسمها printA().
بعدها قمنا بإنشاء كلاس إسمهB يحتوي على دالة إسمها printB() و يرث من الكلاس A
بعدها قمنا بإنشاء كلاس إسمه C يحتوي على دالة إسمها printC() و يرث من الكلاس A أيضاً
الناتج
كود:
Hello from class A
Hello from class B
Hello from class A
Hello from class C
لتأكيد أن الوراثة المتعددة هو أن كلاس واحد فقط يرث من عدة class
أما الوراثة الهرمية هو أن ال class يرثون من كلاس واحد
الوراثة المتعددة الوراثة الهرمية
1711206838213.png
1711206887460.png

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

دروس البرمجة الكائنية
 
التعديل الأخير بواسطة المشرف:
جزاك الله خير على هذا المجهود الرائع يا سديل، ننتظر المزيد والمزيد ❤️
 

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

فانوس

رمضان
عودة
أعلى