استخدام مؤثر النطاق في ++C
استخدام مؤثر النطاق
كيف أمكن للدالتين pop(), push() في الفئة المشتقة أن تستدعي الدوال المقابلة لها في الفئة الأساسية ؟ لقد استخدم لذلك مؤثر النطاق scope resolution علي الصورة :
Stack :: push(var);
Return stack :: pop();
ولولا استخدام هذا المؤثر لظن المترجم أن كل دالة تستدعي نفسها , وهو بالطبع ما لا يقبله فهذا المؤثر يمكنك من أن تحدد أي فئة تنتمي إليها الدالة المطلوبة .
تعديل برنامج الأبعاد الإنجليزية
التطبيق التالي أكثر تطورا في استخدام التوارث , سوف نعدل البرنامج الخاص بالأبعاد الإنجليزية لكي يتضمن الأبعاد السالبة مع الموجبة .
englen.cpp
// englen.cpp// inheritance using English Distances// UCS Laboratories#include <iostream.h>
#include <conio.h>
class Distance // English Distance class
{protected: // NOTE: can't be private
int feet; float inches; public: Distance() // constructor (no args) { feet = 0; inches = 0.0; }Distance(int ft, float in) // constructor (two args)
{ feet = ft; inches = in; }void getdist() // get length from user
{ cout << "\nEnter feet: "; cin >> feet; cout << "Enter inches: "; cin >> inches;}
void showdist() // display distance
{ cout << feet << "\'-" << inches << '\"'; }};
enum posneg { pos, neg }; // for sign in DistSign
class DistSign : public Distance // adds sign to Distance
{ private: posneg sign; // sign is pos or neg public: // constructor (no args) DistSign() : Distance() // call base constructor { sign = pos; } // set the sign to + // constructor (2 or 3 args)DistSign(int ft, float in, posneg sg=pos) :
Distance(ft, in) // call base constructor
{ sign = sg; } // set the signvoid getdist() // get length from user
{ Distance::getdist(); // call base getdist()char ch; // get sign from user
cout << "Enter sign (+ or -): "; cin >> ch; sign = (ch=='+') ? pos : neg;}
void showdist() // display distance
{cout << ( (sign==pos) ? "(+)" : "(-)" ); // show sign
Distance::showdist(); // ft and in}
};
void main() { DistSign alpha; // no-arg constructor alpha.getdist(); // get alpha from user DistSign beta(11, 6.25); // 2-arg constructor DistSign gamma(100, 5.5, neg); // 3-arg constructor // display all distances cout << "\nalpha = "; alpha.showdist(); cout << "\nbeta = "; beta.showdist(); cout << "\ngamma = "; gamma.showdist();getche();
}
تضيف الفئة distsign إمكانية التعامل مع الأبعاد السالبة والموجبة , والفئة الأصلية كما هي عدا تحويل نوع البيانات من النوع الخاص إلي النوع المحمي , وهو أجزاء لم يكن من داع له , فالدالة المشتقة ليست بها حاجة للتعامل مع بيانات الدالة الأصلية , ولكنه الإجراء المحبذ كما أشرنا .
الدوال المنتمية للفئة المشتقة
للفئة المشتقة distsign بادئتان , يماثلان ما في الفئة الأصلية , واحدة بلا معامل والثانية ذات معاملين , أو ثلاثة . المعامل الثالث , وهو اختياري ذو قيمتين pos, neg , ووضعه المبدئي هو pos وتشكل البادئتان كائنات الفئة المشتقة بعدة طرق .
كلتا البادئتين تستدعي البادئة المقابلة لها في الفئة الأصلية , كي تحدد الأقدام والبوصات , ثم تضيف من عندها وظيفة ثالثة , هي الإشارة وهي موجبة بحكم الوضع المبدئي .
وقد تطلبت إضافة الإشارة تعديلا في كل دالة من دوال الفئة المشتقة , بالشكل الواضح في البرنامج .
وكما تري تقدم لغة السي ++ أكثر الوسائل كفاءة في الاستفادة من خاصية التوارث فما تريد استخدامه من الفئة الأصلية متاح لك ، سواء أكان بيانا , أم بادئة أم دالة منتمية . وقد لاحظت أننا لم نحتج بالمرة إلي تكرار أمر من الأوامر .
تعليقات
إرسال تعليق