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

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

Sadell_AliSadell_Ali is verified member.

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

السمعة:

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

قبل أن نبدأ. بعتذر جدا عن الانقطاع الطويل
من أيّ أبواب الثناء سندخل وبأي أبيات القصيد نعبر، وفي كل لمسة من جودكم وأكفكم للمكرمات أسطر
شكراً جزيلاً الى جميع اعضاء شبكة شل العربي الذين يجعلونا دائماً نتذكر النية الخالصة في تقديم العلم و إن كان بسيطًا لوجه الله عز وجل

( Polymorphism )

تعدد الأشكال (Polymorphism) هو مفهوم أساسي في البرمجة الكائنية (Object-Oriented Programming - OOP) يسمح للكائنات بأن تُستخدم وكأنها من أنواع متعددة. يتجلى هذا المفهوم بشكل رئيسي في قدرتك على استدعاء نفس الطريقة (method) على كائنات مختلفة، وسيقوم كل كائن بتنفيذ الطريقة بطريقة تختلف عن الأخرى، بناءً على نوع الكائن اذا هي "عملية تسمح لجميع الكائنات بأن تكون كائنات من الكلاس الأساسي باستخدام المؤشرات".


سيتم اعطاء كود يوضح بعض المفاهيم قبل أن يتم التطرق الى مفهوم ال (Polymorphism) بشكل عملي


C++:
#include <iostream>


using namespace std;


class Base {



    int ID;


    string name;


    double salary;


    // string ونوع integer ونوع double   تم تعريف 3 متغيرات من نوع


    public:

Base(int a, string b, double c) { ID=a ; name=b ; salary=c ; }

//   وإعطائهم قيم function Constructor هنا تم إنشاء



    double getSalary() {  return salary ; }

  //salary يقوم بإرجاع قيمة المتغير function


  void print() {  cout << ID << ", " << name << ", " << salary << endl ; }

//  يقوم بطباعة قيم المتغيرات function

       } ;


     class Derived : public Base {


                      double sales, commission ;


     //  Base يرث من الكلاس Derived  هنا قمنا بإنشاء كلاس  إسمه


        //   double وإنشاء متغيران من نوع


            public:


                   Derived(int a, string b, double c, double d, double e) : Base(a, b, c)


                      {sales=d; commission=d;}

           //  class Base  الذي قمنا بالتوريث منه وهو    Constructors واستدعاء ال Constructors    تم أنشاء


double getSales() {return sales ;}

//Sales يقوم بإرجاع قيمة finction


        void print ()

                        {

                        Base :: print ();

                        cout<< sales << commission;

                        }

 class Base التابع ل   function print  يعمل على استدعاء function  //
                         commission  و  sales ويعمل على طباعة قيمة   //
         } ;


                void main{
    
                        Base a(20, "ali" ,  1000) ;
                        Derived b (30 , "yaman",2000, 100 ,0.5) ;
                        Base *ptr = 0 ;
                        Derived *ptr1 = 0
           
                      cout<< a. getsalary();
                      cout<< a. getsalary() ;

                     cout<<a. print() ;
                    cout<<b .getsalary() ;
                    cout<<b .getsales() ;
                    cout<< b. print ();
                       ptr =& a;
                      ptr -> print();
                      //  ptr -> getsales() ;                 // Error
                        ptr1=&b;
                       //  cout<< ptr1 -> get salary();

شرح الكود بشكل عام =>
هذا الكود يحتوي على 2 class يقوم class Base بتوريث class Derived و الان سيتم عرض كل ال Commands وشرحها وإظهار نتائجها
C++:
            void main{

                        Base a(20, "ali" ,  1000) ;

                        Derived b (30 , "yaman",2000, 0.5) ;

                        Base *ptr = 0 ;

                        Derived *ptr1 = 0 ;

                    cout<< a. getsalary() ;}

هنا تم إنشاء كائن يتبع ل class Base وبمجرد إنشاء الكائن يتم استدعاء ال Constructor وإعطاء قيم للمتغيرات الموجودة .
وتم ايضا إنشاء كائن يتبع ل class Dreived وإعطاء قيم لل Constructor الخاص به
ومن ثم تم إنشاء مؤشرين أحدهما من نوع Base والاخر من نوع Derived و جعلهما يؤشران على 0 والتي تعني
NULL Pointer : تعيين قيمة 0 إلى مؤشر يعني أن المؤشر لا يشير إلى أي عنوان ذاكرة فعلي. يُعرف هذا عادةً باسم المؤشر الفارغ
وتم إستدعاء function getsalary الذي يعمل على ارجاع قيمة ال salary من خلال [ a. getsalary] وطباعته
الناتج :
كود:
1000
C++:
void main {

                   cout<<a. print() <<endl;

                  cout<<b .getsalary() <<endl;

                  cout<<b .getsales()<<endl ;

                  cout<< b. print ()<<endl;

               }
() a. print => الكائن a قام بإستدعاء function الطباعة لطباعة المتغيرات
وهنا قام الكائن b والذي نوعه Dreived بإستدعاء getsalary function والتي تقوم بإرجاع قيمة salary وطباعته (وهذا الfunction تم وراثته من class Base )
في ال Command الثالث قام الكائنb بإستدعاء function getsales والذي يعمل على ارجاع قيمة sales وطباعته
ويجب ان انوه على ان function print الذي يوجد ب class Dreived قام باستدعاء function print التابع ل class Base لكي يستطيع الوصول الى المتغيرات الموجودة ب class Base لان هذه المتغيرات من نوع private


الناتج
C++:
20  Ali   1000
2000
100
30   yaman  2000  100   0.5 [/COLOR]
 [COLOR=rgb(44, 130, 201)]


C++:
                       ptr =& a;

                      ptr -> print();

                      //  ptr -> getsales() ;                 // Error

                        ptr1=&b;

                       //  cout<< ptr1 -> get salary();

في بداية الكود قمنا بجعل المؤشر من نوع Base يؤشر على الكائن a والذي هو ايضاً من نوع Base
تنويه: عند التعامل مع كائن يتم الوصول الى ال functions عن طريق (Dot Operator) "." بينما عند التعامل مع مؤشر فيتم الوصول الى ال functions من خلال ال "arrow " <- "

اذا قام المؤشر من نوع Base بالوصول الى function print وعند محاولته الوصول الى getsales قام بإعطاء error لان المؤشر من نوع Base ويحاول الوصول الى function getsales والذي ينتمي الى Derived
وقمنا ايضاً بجعل المؤشر من نوع Derived يؤشر على الكائن b والذي هو ايضاً من نوع Derived
وأخيراً من خلال المؤشر من نوع Derived تم الوصول الى get salary

الناتج:
C++:
 20  Ali   1000
C++:
error
كود:
2000

الى الان لم يتم التطرق الى مفهوم ال Polymorphism 😅 الان سيتم عرض كود يوضح مفهومه 😊



C++:
 void main{

                        Base a(20, "ali" ,  1000) ;

                        Derived b (30 , "yaman",2000, 100 , 0.5) ;

                        Base *ptr = 0 ;

                        Derived *ptr1 = 0

                        ptr = &b;

                        cout<< ptr -> getsalary();

                        cout<< ptr -> print();

                        cout<< ptr -> sales();                      //error

                        ptr1 =&a;                                         // error

 }


في هذا الكود تم أنشاء كائنين أحدهما من نوع Base والاخر من نوع Derived
وتم إنشاء مؤشرين وجعلهما يؤشران على null ثم تم جعل المؤشر من نوع Base يؤشر على عنوان الكائن b وهو من نوع Derived
(نستطيع جعل مؤشر "من نوع ال class الذي يورث" أن يؤشر على كائن ينتمي الى "class الذي يقوم بالوراثة" )
لكن العكس لااااا يمكن وسنتطرق لها في ال command القادمة
الا
ن قام المؤشر من نوع Base بالوصول الى getsalary والذي ينتمي الى class Base لكن القيم تكون قيم الكائن b التابع ل class Derived وهذا هو ال (Polymorphism )
شرح لتوضيح الفكرة بشكل أفضل => نستطيع جعل مؤشر "من نوع ال class الذي يورث" أن يؤشر على كائن ينتمي الى "class الذي يقوم بالوراثة" وهنا يستطيع المؤشر الوصول الى ال Methods التابعة الى ال class الذي يورث لكن هذه القيم تكون قيم الكائن من نوع ال class الذي يقوم بالوراثة
ptr -> print وهنا قام المؤشر من نوع Base بالوصول الى print والذي ينتمي الى class Base لكن القيم تكون قيم الكائن b التابع ل class Derived وهذا هو ايضاً ال (Polymorphism )
ptr -> sales سيكون الناتج لهذا ال command هو error وذلك لان المؤشر حاول الوصول الى Function تابع ل class Derived وهو غير مصرح له بالوصول الى Function تابع ل class Derived فقط يستطيع الوصول الى Function تابع ل class Base
واخيراً سيكون ناتج ال command الاخير error لانه لا يمكن جعل مؤشر من نوع ال class الذي يرث يؤشر على كائن من نوع ال class الذي يورث

الناتج:

C++:
2000
C++:
30 yaman 2000
C++:
error

مثال اخر يدعم ال (Polymorphism)
C++:
#include <iostream>

# include <string>

using namespace std;

class Animal {

    string name;

    public:

    Animal(string b)

        {name=b;}

    void makeSound()

        {cout<<name << "   :animal makes a sound" << endl;}

};

class Dog : public Animal

{

    int age_dog;

    public:

    Dog(string c,int s)

        :Animal(c){age_dog=s;}

    void makeSound()

        {Animal::makeSound();

        cout <<" the dog is: "<<age_dog<<"year old"<< endl;}

 

};

int main()

{   Animal  S("Rocky") ;   //  Animal  كائن من نوع

    Dog f("max",4);       //   Animal  مع العلم أنه تورث من Dog  كائن من نوع

    Animal *ptr =0;      //       null  يؤشر على Animal  مؤشر من نوع

    Dog *ptr1=0;           //  null يؤشر على  Dog  مؤشر من نوع

    ptr =&f;         //          Dog    يؤشر على الكائن من نوع  Animal تم جعل المؤشر  من نوع

    ptr->makeSound();          //      "Polymorphism"   class Animal التي توجد في   makeSound  هذا المؤشر قام بالوصول الى
الشرح موجود في نفس الكود
الناتج :
C++:
max   :animal makes a sound

لا تنسوا الدعاء لأهل غزة، أن يرفع الله عنهم البلاء وينصرهم على من ظلمهم، وأن يرزقهم السلام والأمان
🌸 يعطيكم العافية🌸

دروس البرمجة الكائنية
 
الله يعطيكِ العافية موضوع رائع جهودك مشكورة.
 
بارك الله فيك مهندسة وجزاك الله كل خير
ننتظر جديدك دائماً
 
ما شاء الله مهندسة
الله يعطيك العافية

مواضيعكم مميزة و حتى لو رأيتم أنها بسيطة
 
☘️بسم الله الرحمن الرحيم☘️
قبل ما نبدا بعتذر جدا عن الانقطاع الطويل
من أيّ أبواب الثناء سندخل وبأي أبيات القصيد نعبر، وفي كل لمسة من جودكم وأكفكم للمكرمات أسطر
شكراً جزيلاً الى جميع اعضاء شبكة شل العربي الذين يجعلونا دائماً نتذكر النية الخالصة في تقديم العلم و إن كان بسيطاً لوجه الله عز وجل

( Polymorphism )

تعدد الأشكال (Polymorphism) هو مفهوم أساسي في البرمجة الكائنية (Object-Oriented Programming - OOP) يسمح للكائنات بأن تُستخدم وكأنها من أنواع متعددة. يتجلى هذا المفهوم بشكل رئيسي في قدرتك على استدعاء نفس الطريقة (method) على كائنات مختلفة، وسيقوم كل كائن بتنفيذ الطريقة بطريقة تختلف عن الأخرى، بناءً على نوع الكائن اذا هي "عملية تسمح لجميع الكائنات بأن تكون كائنات من الكلاس الأساسي باستخدام المؤشرات".


سيتم اعطاء كود يوضح بعض المفاهيم قبل أن يتم التطرق الى مفهوم ال (Polymorphism) بشكل عملي


كود:
#include <iostream>


using namespace std;


class Base {



    int ID;


    string name;


    double salary;


    // string ونوع integer ونوع double   تم تعريف 3 متغيرات من نوع


    public:

Base(int a, string b, double c) { ID=a ; name=b ; salary=c ; }

//   وإعطائهم قيم function Constructor هنا تم إنشاء



    double getSalary() {  return salary ; }

  //salary يقوم بإرجاع قيمة المتغير function


  void print() {  cout << ID << ", " << name << ", " << salary << endl ; }

//  يقوم بطباعة قيم المتغيرات function

       } ;


     class Derived : public Base {


                      double sales, commission ;


     //  Base يرث من الكلاس Derived  هنا قمنا بإنشاء كلاس  إسمه


        //   double وإنشاء متغيران من نوع


            public:


                   Derived(int a, string b, double c, double d, double e) : Base(a, b, c)


                      {sales=d; commission=d;}

           //  class Base  الذي قمنا بالتوريث منه وهو    Constructors واستدعاء ال Constructors    تم أنشاء


double getSales() {return sales ;}

//Sales يقوم بإرجاع قيمة finction


        void print ()

                        {

                        Base :: print ();

                        cout<< sales << commission;

                        }

 class Base التابع ل   function print  يعمل على استدعاء function  //
                         commission  و  sales ويعمل على طباعة قيمة   //
         } ;


                void main{
      
                        Base a(20, "ali" ,  1000) ;
                        Derived b (30 , "yaman",2000, 100 ,0.5) ;
                        Base *ptr = 0 ;
                        Derived *ptr1 = 0
             
                      cout<< a. getsalary();
                      cout<< a. getsalary() ;

                     cout<<a. print() ;
                    cout<<b .getsalary() ;
                    cout<<b .getsales() ;
                    cout<< b. print ();
                       ptr =& a;
                      ptr -> print();
                      //  ptr -> getsales() ;                 // Error
                        ptr1=&b;
                       //  cout<< ptr1 -> get salary();

شرح الكود بشكل عام =>
هذا الكود يحتوي على 2 class يقوم class Base بتوريث class Derived و الان سيتم عرض كل ال Commands وشرحها وإظهار نتائجها
كود:
            void main{

                        Base a(20, "ali" ,  1000) ;

                        Derived b (30 , "yaman",2000, 0.5) ;

                        Base *ptr = 0 ;

                        Derived *ptr1 = 0 ;

                    cout<< a. getsalary() ;}

هنا تم أنشاء كائن يتبع ل class Base وبمجرد إنشاء الكائن يتم استدعاء ال Constructor وإعطاء قيم للمتغيرات الموجودة .
وتم ايضا إنشاء كائن يتبع ل class Dreived وإعطاء قيم لل Constructor الخاص به
ومن ثم تم إنشاء مؤشرين أحدهما من نوع Base والاخر من نوع Derived و جعلهما يؤشران على 0 والتي تعني
NULL Pointer : تعيين قيمة 0 إلى مؤشر يعني أن المؤشر لا يشير إلى أي عنوان ذاكرة فعلي. يُعرف هذا عادةً باسم المؤشر الفارغ
وتم إستدعاء function getsalary الذي يعمل على ارجاع قيمة ال salary من خلال [ a. getsalary] وطباعته
الناتج :
كود:
1000
كود:
void main {

                   cout<<a. print() <<endl;

                  cout<<b .getsalary() <<endl;

                  cout<<b .getsales()<<endl ;

                  cout<< b. print ()<<endl;

               }
() a. print => الكائن a قام بإستدعاء function الطباعة لطباعة المتغيرات
وهنا قام الكائن b والذي نوعه Dreived بإستدعاء getsalary function والتي تقوم بإرجاع قيمة salary وطباعته (وهذا الfunction تم وراثته من class Base )
في ال Command الثالث قام الكائنb بإستدعاء function getsales والذي يعمل على ارجاع قيمة sales وطباعته
ويجب ان انوه على ان function print الذي يوجد ب class Dreived قام باستدعاء function print التابع ل class Base لكي يستطيع الوصول الى المتغيرات الموجودة ب class Base لان هذه المتغيرات من نوع private


الناتج
كود:
20  Ali   1000
2000
100
30   yaman  2000  100   0.5


C++:
                       ptr =& a;

                      ptr -> print();

                      //  ptr -> getsales() ;                 // Error

                        ptr1=&b;

                       //  cout<< ptr1 -> get salary();

في بداية الكود قمنا بجعل المؤشر من نوع Base يؤشر على الكائن a والذي هو ايضاً من نوع Base
تنويه: عند التعامل مع كائن يتم الوصول الى ال functions عن طريق (Dot Operator) "." بينما عند التعامل مع مؤشر فيتم الوصول الى ال functions من خلال ال "arrow " <- "

اذا قام المؤشر من نوع Base بالوصول الى function print وعند محاولته الوصول الى getsales قام بإعطاء error لان المؤشر من نوع Base ويحاول الوصول الى function getsales والذي ينتمي الى Derived
وقمنا ايضاً بجعل المؤشر من نوع Derived يؤشر على الكائن b والذي هو ايضاً من نوع Derived
وأخيراً من خلال المؤشر من نوع Derived تم الوصول الى get salary

الناتج:
C++:
 20  Ali   1000
C++:
error
كود:
2000

الى الان لم يتم التطرق الى مفهوم ال Polymorphism 😅 الان سيتم عرض كود يوضح مفهومه 😊



C++:
 void main{

                        Base a(20, "ali" ,  1000) ;

                        Derived b (30 , "yaman",2000, 100 , 0.5) ;

                        Base *ptr = 0 ;

                        Derived *ptr1 = 0

                        ptr = &b;

                        cout<< ptr -> getsalary();

                        cout<< ptr -> print();

                        cout<< ptr -> sales();                      //error

                        ptr1 =&a;                                         // error

 }


في هذا الكود تم أنشاء كائنين أحدهما من نوع Base والاخر من نوع Derived
وتم إنشاء مؤشرين وجعلهما يؤشران على null ثم تم جعل المؤشر من نوع Base يؤشر على عنوان الكائن b وهو من نوع Derived
(نستطيع جعل مؤشر "من نوع ال class الذي يورث" أن يؤشر على كائن ينتمي الى "class الذي يقوم بالوراثة" )
لكن العكس لااااا يمكن وسنتطرق لها في ال command القادمة
الا
ن قام المؤشر من نوع Base بالوصول الى getsalary والذي ينتمي الى class Base لكن القيم تكون قيم الكائن b التابع ل class Derived وهذا هو ال (Polymorphism )
شرح لتوضيح الفكرة بشكل أفضل => نستطيع جعل مؤشر "من نوع ال class الذي يورث" أن يؤشر على كائن ينتمي الى "class الذي يقوم بالوراثة" وهنا يستطيع المؤشر الوصول الى ال Methods التابعة الى ال class الذي يورث لكن هذه القيم تكون قيم الكائن من نوع ال class الذي يقوم بالوراثة
ptr -> print وهنا قام المؤشر من نوع Base بالوصول الى print والذي ينتمي الى class Base لكن القيم تكون قيم الكائن b التابع ل class Derived وهذا هو ايضاً ال (Polymorphism )
ptr -> sales سيكون الناتج لهذا ال command هو error وذلك لان المؤشر حاول الوصول الى Function تابع ل class Derived وهو غير مصرح له بالوصول الى Function تابع ل class Derived فقط يستطيع الوصول الى Function تابع ل class Base
واخيراً سيكون ناتج ال command الاخير error لانه لا يمكن جعل مؤشر من نوع ال class الذي يرث يؤشر على كائن من نوع ال class الذي يورث

الناتج:

C++:
2000
C++:
30 yaman 2000
C++:
error

مثال اخر يدعم ال (Polymorphism)
C++:
#include <iostream>

# include <string>

using namespace std;

class Animal {

    string name;

    public:

    Animal(string b)

        {name=b;}

    void makeSound()

        {cout<<name << "   :animal makes a sound" << endl;}

};

class Dog : public Animal

{

    int age_dog;

    public:

    Dog(string c,int s)

        :Animal(c){age_dog=s;}

    void makeSound()

        {Animal::makeSound();

        cout <<" the dog is: "<<age_dog<<"year old"<< endl;}

 

};

int main()

{   Animal  S("Rocky") ;   //  Animal  كائن من نوع

    Dog f("max",4);       //   Animal  مع العلم أنه تورث من Dog  كائن من نوع

    Animal *ptr =0;      //       null  يؤشر على Animal  مؤشر من نوع

    Dog *ptr1=0;           //  null يؤشر على  Dog  مؤشر من نوع

    ptr =&f;         //          Dog    يؤشر على الكائن من نوع  Animal تم جعل المؤشر  من نوع

    ptr->makeSound();          //      "Polymorphism"   class Animal التي توجد في   makeSound  هذا المؤشر قام بالوصول الى
الشرح موجود في نفس الكود
الناتج :
C++:
max   :animal makes a sound

لا تنسوا الدعاء لأهل غزة، أن يرفع الله عنهم البلاء وينصرهم على من ظلمهم، وأن يرزقهم السلام والأمان
🌸 يعطيكم العافية🌸
يعطيكِ الف عافية سديل ❤️
 
واخيرا رجعتلينا بمواضيعك الجميلة سديل 💙
يعطيك العافية يارب
 

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

فانوس

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