رجعنا بعد الفطور ...
أولاً أشكر كل الأخوة الذين علقوا على الموضوع ...
------------------------------
س1- هل نستطيع القول عن السي ++ أنها كائنية التوجه OOP ؟
شوف يا .. CHALLENGER .. أعرف بأن سؤالك يدل عن حيره لأن هناك من يقول نعم هي كائنية والآخر يقول لا بل ليست كذلك ... وفي الحقيقة لا أدري الصنف الآخر وهم الذين يقولون بأنها غير كائنية ما هو دليلهم ...
إذن لنرد على هذا الكلام كالتالي :
إشترط الباحثون بأن أي لغة تريد أن تكون كائنية يجب أن تدعم عدة مصطلحات ومن أهمها ..
الـ Class الفئات
الـ Polymorphism تعدد الأشكال
الـ Encapsulation التغليف
الـ Inheritance الوراثة
------------------------------
الآن لنرى هل تدعم السي بلس بلس هذه المصطلحات :
الـ Class الفئات: بكل بساطة هي عبارة عن الكائن مع محتوياته من data member و data function , بمعني آخر ((هي مجموعة من الدوال والمتغيرات لها علاقة ببعضها البعض.
في المثال بالأسفل قمنا بعمل فئة وأسمينها ((Mosters)) وحوش ,, وقمنا بتعريف القيم والمشيدات فية ,,, وأعلنا عن هذا الوحش ككائن بي الدالة الرئيسية وسميناه Kong
كود:
//By RAAAAD
#include <iostream>
#include <string>
using namespace std;
class Monsters
{
public :
Monsters(string name,int power,int damage);
void dis();
private:
string mname;
int mpower;
int mdamage;
};
Monsters::Monsters (string name,int power,int damage)
{
this->mname = name;
this->mpower = power;
this->mdamage = damage;
}
void Monsters::dis ()
{
cout << "The Name Of Monster Is: " << this->mname << endl;
cout << "The Power Of Monster Is: " << this->mpower << endl;
cout << "The Damage Of Monster Is: " << this->mdamage << endl;
}
int main()
{
Monsters Kong("KONG",4,6);
Kong.dis ();
cout << "-----------------------------"<< endl;
}
==================
الـ Polymorphism تعدد الأشكال : هو المصطلح الذي يتيح لي لجعل الفئة تتخذ أكثر من
شكل, وجميع هذه الأشكال تنتمي للشكل الرئيسي
نأخذ مثال على ذالك, حيث نلاحظ كيف أن الفئة shapes أخذت أكثر من شكل ففي مرة أخذت شكل الدائرة , وفي المرة الآخرى أخذت شكل المستطيل
كود:
//By RAAAAD
#include <iostream>
#include <string>
using namespace std;
const float pi = 3.14;
class shapes
{
public:
virtual float area();
virtual float perimeter();
virtual string type();
};
class circle : public shapes
{
public:
circle(float x);
float area();
float perimeter();
string type();
private :
float mx;
};
class rectangle : public shapes
{
public:
rectangle(float w,float l);
string type();
float area();
float perimeter();
private :
float mw;
float ml;
};
string shapes::type ()
{
return "No Shapes";
}
float shapes::area ()
{
return 0;
}
float shapes::perimeter ()
{
return 0;
}
circle::circle(float x)
{
this->mx = x;
}
float circle::area ()
{
return pi * this->mx * this->mx;
}
string circle::type()
{
return "Circle";
}
float circle::perimeter()
{
return 2 * pi * this->mx ;
}
rectangle::rectangle (float w, float l)
{
this->ml = l;
this->mw = w;
}
string rectangle::type ()
{
return "Rectangle";
}
float rectangle::area ()
{
return this->mw * this->ml ;
}
float rectangle::perimeter ()
{
return 2 * this->mw + 2* this->ml ;
}
int main()
{
shapes* ss[8];
ss[0] = new circle(1);
ss[1] = new circle(2);
ss[2] = new circle(3);
ss[3] = new circle(4);
ss[4] = new rectangle(2,4);
ss[5] = new rectangle(6,4);
ss[6] = new rectangle(2,10);
ss[7] = new rectangle(2,8);
for (int i =0;i <8;i ++)
{
cout << ss[i]->type () <<" ";
cout << ss[i]->area () << " " << ss[i]->perimeter () << endl;
}
for (int i =0;i <8;i ++)
{
delete ss[i];
}
}
==================
الـ Encapsulation التغليف : وهي إخفاء بعض البيانات لحمايات الكائن .. بواسطة إستخدام الجمل التالي :
public في حالة الرغبة بمشاركة أجزاء هذا الكائن مع أي جزء أو كائن آخر في الكود
Private : في حالة الرغبة بمشاركة أجزاء الكائن داخلياً فقط.
Protected : في حالة مشاركة أجزاء من الكائن مع كائن آخر تربطهم علاقو وراثة ..
==================
الـ Inheritance الوراثة : وهي توريث جمييع خصائص الـ Base Class إلى الـ Sub Class , كما في المثال بالأسفل .. حيث أن لدينا فئة Monsters وهي الفئة الأساسية ,, وغالباً ما تكون هذه الفئة ((Base Class )) في الفئة التي تحوي الروابط المشتركة ما بين الـ Sub Class , يعني نلاحظ في المثال بأن جميع الوحوش Gorila أو Shark سيكون لها إسم, وطاقة, وقوة تدمير ...
كود:
//By RAAAAD
#include <iostream>
#include <string>
using namespace std;
//Base Class
class Monsters
{
public :
Monsters(string name,int power,int damage);
protected:
string mname;
int mpower;
int mdamage;
};
//Derive Class
class Gorila : public Monsters
{
public:
Gorila(string name,int power,int damage,int boxing);
void dis();
private:
int mboxing;
};
class Shark : public Monsters
{
public:
Shark(string name,int power,int damage,int hunt);
void dis();
private:
int mhunt;
};
//Decleartion of Monsters
Monsters::Monsters (string name,int power,int damage)
{
this->mdamage = damage;
this->mname = name;
this->mpower = power;
}
//Decleartion of Gorila
Gorila::Gorila (std::string name,int power,int damage,int boxing) : Monsters(name,power,damage)
{
this->mboxing = boxing;
}
//Print Function
void Gorila::dis ()
{
cout << "The Name Of Monster Is: " << this->mname << endl;
cout << "The Power Of Monster Is: " << this->mpower << endl;
cout << "The Damage Of Monster Is: " << this->mdamage << endl;
cout << "The Boxing Of Monster Is: " << this->mboxing << endl;
}
Shark::Shark (std::string name,int power,int damage,int hunt) : Monsters(name,power,damage)
{
this->mhunt = hunt;
}
void Shark::dis ()
{
cout << "The Name Of Monster Is: " << this->mname << endl;
cout << "The Power Of Monster Is: " << this->mpower << endl;
cout << "The Damage Of Monster Is: " << this->mdamage << endl;
cout << "The Hunt Of Monster Is: " << this->mhunt << endl;
}
//Access Point
int main()
{
Gorila Kong("KONG",3,5,9);
Shark Fish("BigFish",4,6,7);
Kong.dis ();
cout << "-----------------------------"<< endl;
Fish.dis ();
}
الخلاصة :
نستطيع أن نستنتج بأن الـ c++ كائنية ... بلا خلاف ... ولأكن الإختلاف يكون بي نسبة دعمها لهذا المفهوم ..
ملاحظة ...
أي شئ غير مفهوم بالأعلا الرجاء إخباري .. وسأقوم بتوضيحة