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