الاحتواء , كائن ضمن كائن في ++C
الاحتواء , كائن ضمن كائن
في التوارث حينما تكون الفئة أ مشتقة من الفئة ب , يمكن أن نقول إن الفئة أ نوع من الفئة ب كمثل قولنا إن الصقور نوع من الطيور , لكونها تحمل كافة صفات الطيور ( الأجنحة , المقدرة علي الطيران) , وصفات مميزة لها (حدة الإبصار قوة المخالب والمنقار ) . ولهذا فإنه كثير ما يطلق علي التوارث : علاقة نوع من king of relation
ويوجد نوع أخر يماثل هذه العلاقة تسمي : علاقة الإحتواء containership أو علاقة : له has a relation . فالصفر له ذيل بمعني أن كل صفر له ذيل ] يسمي ذلك في علم المنطق تعريف جامع , أي يجمع كافة أفراد الفئة [ وتمثل هذه العلاقة في الأسلوب الكائني حينما يتضمن كائن كائنا أخر بالصورة التالية :
Class A
{
};
Class B
{
A objA; // define obj A an object of class A };
وكثيرا ما يؤدي الاحتواء والتوارث لنفس النتيجة , ففي المثال التالي سوف نعيد صياغة البرنامج empmult.cpp بحيث تعرف كل من فئة المدير والباحث علي أنهما يحتويان علي كائنات منفئتي العامل والدارس .
empcont.cpp
// empcont.cpp// containership with employees and degrees// UCS Laboratories#include <iostream.h>
#include <conio.h>
const int LEN = 80; // maximum length of names
class student // educational background
{ private:char school[LEN]; // name of school or university
char degree[LEN]; // highest degree earned
public: void getedu() { cout << " Enter name of school or university: ";cin >> school;
cout << " Enter highest degree earned \n"; cout << " (Highschool, Bachelor's, Master's, PhD): ";cin >> degree;
}
void putedu() { cout << "\n School or university: " << school; cout << "\n Highest degree earned: " << degree;}
};
class employee { 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 // management
{ private:char title[LEN]; // "vice-president" etc.
double dues; // golf club dues
employee emp; // object of class employee student stu; // object of class student public: void getdata() {emp.getdata();
cout << " Enter title: "; cin >> title; cout << " Enter golf club dues: "; cin >> dues;stu.getedu();
}
void putdata() {emp.putdata();
cout << "\n Title: " << title; cout << "\n Golf club dues: " << dues;stu.putedu();
}
};
class scientist // scientist
{ private:int pubs; // number of publications
employee emp; // object of class employee student stu; // object of class student public: void getdata() {emp.getdata();
cout << " Enter number of pubs: "; cin >> pubs;stu.getedu();
}
void putdata() {emp.putdata();
cout << "\n Number of publications: " << pubs;stu.putedu();
}
};
class laborer // laborer
{ private: employee emp; // object of class employee public: void getdata() { emp.getdata(); } void putdata() { emp.putdata(); }};
void main() {manager m1;
scientist s1, s2;
laborer l1;
cout << endl;
cout << "\nEnter data for manager 1"; // get data for
m1.getdata(); // several employees cout << "\nEnter data for scientist 1";s1.getdata();
cout << "\nEnter data for scientist 2";s2.getdata();
cout << "\nEnter data for laborer 1";l1.getdata();
cout << "\nData on manager 1"; // display data for
m1.putdata(); // several employees cout << "\nData on scientist 1";s1.putdata();
cout << "\nData on scientist 2";s2.putdata();
cout << "\nData on laborer 1";l1.putdata();
getche();
}
وتلاحظ أن فئة manager لم تعرف كفئة مشتقة من الفئتين بل ضمت في عناصر بياناتها كائن من كل من الفئتين :
Employee emp;
Student stu;
[ وتلاحظ نتيجة لذلك أن استدعاء كل دالة من فئة أساسية ليس بمؤثر النطاق "::", بل عن طريق مؤثر النقطة "." الخاص بالدوال المنتمية , كالتالي :
Emp.getdata();
وهكذا لبقية الدوال ]
التوارث والبرمجة
أثر الأسلوب الكائني علي عملية البرمجة كما عرفت علي مر العقود تأثيرا جذريا ,ليس لاستخدام مفهوم الفئات بل لخاصية التوارث , ولنر كان ذلك .
وضع المبرمج أ فئة , ربما شيئا من قبيل الفئة Distance وضمنها كافة العمليات الرياضية المطلوبة .
المبرمج ب أعجب بالفئة , ولكنه يظن إن إضافة الإشارات لها يجعلها أكمل الحل هو اشتقاق فئة جديدة , ولتكن DistSign يزيد عليها ما يري من إضافات , بينما قد لا يكون متاحا له البرنامج المصدري للفئة الأساسية . المبرمجان ج , و د يستخدمان الفئة الثانية .
وهكذا تتميع التفرقة بين كتابة وسائل البرمجة وكتابة التطبيقات , فالمبرمج أ يكتب أداة برمجية شائعة التطبيق , ويعطيها المبرمج ب شكلا أكثر تخصصا ويقوم المبرمجان ج , د في كتابة التطبيقات . فالمبرمج أ هو واضع لأدوات البرمجة , والمبرمجان ج , د كاتبي تطبيقات , أما المبرمج ب فهو في وضع بين الوضعين وعلي أي وضع يعطي المنهج الكائني للبرمجة مذاقا أكثر مرونة وأكثر عمقا في نفس الوقت .
وفي المقالات القادمة , حين نعرض للبرامج الكبيرة سوف نري كيف تقسم الفئات إلي ما يوزع للعملاء , وما يوزع كأدوات برمجية دون إتاحة الكود المصدري .
تعليقات
إرسال تعليق