تدرج التوارث في ++C
تدرج التوارث
كانت الأمثلة المعطاة إلي التوارث في تطوير برامج موجودة وفي المثال الأتي نستخدمها كأساس لتصميم البرنامج المراد وضعه . فهو يمثل قاعدة بيانات أولية لتجميع بيانات عن الموظفين , وجعلناهم في ثلاثة مجموعات فقط , المدراء والباحثون , والعمال . وفي حين تجمع قاعدة البيانات اسم الموظف ورقمه الكودي تجمع للمدراء الوظيفة ومجموع نقاطه في نادي الجولف ] هل يحتفظ بهذها الرقم في بيانات الموظفين في أمريكا ؟ اختيار عجيب من المؤلف , كان من الممكن التفكير في خصيصة أكثر واقعية [ وبالنسبة للباحثين يحتفظ بعدد الأبحاث التي نشرت لهم .
وسوف ننشئ في برنامجا فئة عامة , تتضمن دوال للتعامل مع بيانات الاسم ورقم الموظف ثم نشتق منها ثلاث فئات مدير وباحث وعامل وتحتوي الفئتان الأوليتان البيانات الإضافية والدوال التي تتعامل معها أنظر الشكل .
شكل تدرج التوارث
employ.cpp
// employ.cpp
// models employee database using inheritance
// UCS Laboratories
#include <iostream.h>
#include <conio.h>
const int LEN = 80; // maximum length of names
class employee // employee class
{
private:
char name[LEN]; // employee name
unsigned long number; // employee number
public:
void getdata()
{
cout << "\n Enter last name: "; cin >> name;
cout << " Enter number: "; cin >> number;
}
void putdata()
{
cout << "\n Name: " << name;
cout << "\n Number: " << number;
}
};
class manager : public employee // management class
{
private:
char title[LEN]; // "vice-president" etc.
double dues; // golf club dues
public:
void getdata()
{
employee::getdata();
cout << " Enter title: "; cin >> title;
cout << " Enter golf club dues: "; cin >> dues;
}
void putdata()
{
employee::putdata();
cout << "\n Title: " << title;
cout << "\n Golf club dues: " << dues;
}
};
class scientist : public employee // scientist class
{
private:
int pubs; // number of publications
public:
void getdata()
{
employee::getdata();
cout << " Enter number of pubs: "; cin >> pubs;
}
void putdata()
{
employee::putdata();
cout << "\n Number of publications: " << pubs;
}
};
class laborer : public employee // laborer class
{
};
void main()
{
manager m1, m2;
scientist s1;
laborer l1;
cout << endl;
cout << "\nEnter data for manager 1"; // get data for
m1.getdata(); // several employees
cout << "\nEnter data for manager 2";
m2.getdata();
cout << "\nEnter data for scientist 1";
s1.getdata();
cout << "\nEnter data for laborer 1";
l1.getdata();
cout << "\nData on manager 1"; // display data for
m1.putdata(); // several employees
cout << "\nData on manager 2";
m2.putdata();
cout << "\nData on scientist 1";
s1.putdata();
cout << "\nData on laborer 1";
l1.putdata();
getche();
}
تلاحظ أننا لم نعرف أي كائن منتم للفئة العامة employee فالغرض منها هو أن يشتق منها الفئات الأخري هذه الدوال توصف بأنها abstract ] الترجمة الحرفية مجردة [ علي أن اصطلاح abstract له معني أدق سوف نعرض له في حديثنا عن الدوال الاعتبارية virtual functions في مقالات قادمة .
الملاحظة الأخري أن الفئة labour لم تتضمن أية دوال إضافية وهو ما يوحي بأنها لم تكن ضرورية والواقع أنها توضع فقط لتوضيح أنها فئة علي نفس درجة الفئات الأخري . ومن جهة أخري فقد يحدث تعديل في البرنامج يضيف إليها دوال معينة فلا نضطر للتعديل في الفئة العامة .
تعليقات
إرسال تعليق