




السمعة:
- إنضم2 سبتمبر 2023
- المشاركات 140
- مستوى التفاعل 244
- النقاط 43


قبل أن نبدأ. بعتذر جدا عن الانقطاع الطويل
من أيّ أبواب الثناء سندخل وبأي أبيات القصيد نعبر، وفي كل لمسة من جودكم وأكفكم للمكرمات أسطر
شكراً جزيلاً الى جميع اعضاء شبكة شل العربي الذين يجعلونا دائماً نتذكر النية الخالصة في تقديم العلم و إن كان بسيطًا لوجه الله عز وجل
( 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;
}
وهنا قام الكائن 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
لا تنسوا الدعاء لأهل غزة، أن يرفع الله عنهم البلاء وينصرهم على من ظلمهم، وأن يرزقهم السلام والأمان
يعطيكم العافية


دروس البرمجة الكائنية