الاحتواء , كائن ضمن كائن في ++C

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



وهكذا تتميع التفرقة بين كتابة وسائل البرمجة وكتابة التطبيقات , فالمبرمج أ يكتب أداة برمجية شائعة التطبيق , ويعطيها المبرمج ب شكلا أكثر تخصصا ويقوم المبرمجان ج , د في كتابة التطبيقات . فالمبرمج أ هو واضع لأدوات البرمجة , والمبرمجان ج , د كاتبي تطبيقات , أما المبرمج ب فهو في وضع بين الوضعين وعلي أي وضع يعطي المنهج الكائني للبرمجة مذاقا أكثر مرونة وأكثر عمقا في نفس الوقت .



وفي المقالات القادمة , حين نعرض للبرامج الكبيرة سوف نري كيف تقسم الفئات إلي ما يوزع للعملاء , وما يوزع كأدوات برمجية دون إتاحة الكود المصدري .

تعليقات

المشاركات الشائعة من هذه المدونة

المؤثرات الحسابية في C++

الرسم Graphics

دوال النمط الرسومي في ++C