تدرج التوارث في ++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 لم تتضمن أية دوال إضافية وهو ما يوحي بأنها لم تكن ضرورية والواقع أنها توضع فقط لتوضيح أنها فئة علي نفس درجة الفئات الأخري . ومن جهة أخري فقد يحدث تعديل في البرنامج يضيف إليها دوال معينة فلا نضطر للتعديل في الفئة العامة .
تعليقات
إرسال تعليق