مشاهدة النسخة كاملة : دروس في البرمجة بالكائنات


kahtan_eng
18-06-2006, 12:48 PM
يسعدني ان اقدم لكم الدرس الاول في البرمجة بالكائنات بلغة c++ و هذه الدروس مستخلصة من محاضراتي ففي هذه المادة

البرمجة بالكائنات في لغة C++
تعتبر البرمجة بالكائنات من أحدث و أرقى تقنيات البرمجة نسبيا و فيها يتم تقسيم البرنامج إلى وحدات تدعى بالكائنات Objects. و الكائن هو عبارة عن كتلة برمجية من الدوال و المتغيرات حيث يستطيع الكائن محاكاة الأمور الحياتية بواقية أكثر مما يسهل على المبرمج كتابة التطبيقات المعقدة بطريقة منظمة و مفهومة.
على سبيل المثال يمكن اعتبار الزمن time كائن لديه الخواص ( المتغيرات ) ساعة – دقيقة - ثانية كما يمكن أن يمتلك الكائن مجموعة من الدوال ( الطرق ) للتحكم بهذه الخصائص مثل دالة لعرض الوقت و دالة لضبطه و هكذا.
تتضمن عملية إنشاء الكائن خطوتين أساسيتين الأولى تعريف البرنامج بشكل الكائن و الثانية إنشاء الكائن حسب الشكل المحدد في الخطوة الأولى.
تتضمن عملية تعريف شكل الكائن في البرنامج وضع إطاره العام عن طريق تحديد خواصه و كتابة طرقه و تدعى هذه العملية تعريف صنف Class و الذي هو الزمن في مثالنا الحالي. بعد ذلك يمكن إنشاء كائنات تنتمي للصنف المعرف و في هذه الحالة سوف يعرف الحاسوب خواص و طرق هذه الكائنات المثيلة للصنف الذي تم تعريفه في الخطوة الأولى.
الأصناف Classes
إن أي برنامج يتم تصميمه وفق تقنية OOP يبدأ من الأصناف. و يمكن تعريف الصنف بأنه تركيبة من البيانات و الأوامر اللازمة لتخزين و إدارة هذه البيانات. تدعى المتغيرات التي تمثل البيانات و المعرفة داخل صنف معين بالخواص Properties أما وظائف إدارة البيانات فيطلق عليها بالطرق أو المناهج Methods و لا يمكن إدارة البيانات ( التعامل مع المتغيرات الخاصة بالصنف) إلا عن طريق الطرق الخاصة بالصنف نفسه و بالتالي لا تستطيع الدوال الخارجية غير المنتمية للصنف التعامل مع متغيرات الصنف. على هذا الأساس ترتبط البيانات مع الطرق ( الدوال) ارتباطا وثيقا ضمن كيان واحد يسمى الصنف و يدعى هذا المفهوم بالكبسلة Encapsulation حيث تتميز الكائنات بخاصية إخفاء بياناتها و طريقة التعامل معها داخل الصنف الذي تنتمي إليه.
و الصيغة العامة لتعريف صنف في لغة C++ هي:
class Class_Name
**
public:
تعريف خواص و نماذج طرق الصنف العامة
private:
تعريف خواص و نماذج طرق الصنف الخاصة
};

يقصد بخواص و طرق الصنف العامة تلك المعرفة و المتاحة للاستخدام من قبل الدالة الرئيسية main و الدوال الخارجية الأخرى بينما تكون الخواص و الطرق الخاصة معرفة و متاحة للاستخدام فقط من قبل الدوال المنتمية لنفس الصنف.
تتفق القاعدة العامة في تقنية برمجة OOP على تعريف خواص الصنف من النوع private و طرقه من النوع public و هذا يوفر استقلالية خواص الصنف و أمكانية استدعاه طرقه عند إنشاء كائنات تنتمي لهذا الصنف في الدالة الرئيسية main.
بعد تعريف الصنف يتم تعريف الطرق الذي يتضمنها الصنف حسب قواعد كتابة الدوال في لغة C++.

مثال:
class Time
**
public :
Time();
void settime(int, int, int );
void showtime();
private:
int hour;
int minute;
int second;
};
في هذا المثال عرفنا الصنف الزمن Time الذي تحدثنا عنه سابقا و الذي يمتلك ثلاثة خواص و ثلاثة طرق. تدعى الطريقة التي تحمل نفس اسم الصنف بالدالة البناءة Constructor المرتبطة بهذا الصنف حيث تقوم بوظيفة إعطاء قيم ابتدائية لخواص كل كائن يتم إنشاءه حيث يتم استدعاءه أليا عند إنشاء الكائن. و هذه الدالة دالة عامة ليس لها نوع محدد أي غير مسبوقة بنوع بيانات معين.
بعد تعريف الصنف و خواصه و طرقه يمكن بعد ذلك إنشاء كائنات مثيلة instantiations تنتمي لهذا الصنف كما في الأمثلة التالية:
Time sunset;
Time sunrise;
تدعى sunset و sunrise كائنات مثيلة للصنف Time

ملاحظات:
• لا يمكن إعطاء قيم ابتدائية لخواص الصنف عند تعريفها ضمن جسم الصنف بل يتم إعطاءها قيمها الابتدائية بواسطة الدالة البناءة المرتبطة بالصنف.
• يمكن تعريف طرق الصنف ضمن جسم الصنف ( بدلا من نموذج الطرق ) و في هذه الحالة فأن هذه الطرق تأخذ أوتوماتيكيا الصفة inline أما عند تعريف الطرق خارج الصنف يجب أن يسبق اسم الطريقة أسم الصنف متبوعة بالرمز :: لتحديد أن هذه الطريقة تنتمي للصنف المحدد.
void Time :: settime( int h, int m , int s)

مثال: تعريف الصنف Time و إنشاء الكائنين المثيلين له sunset و sunrise
# include <iostream.h>
# include <conio.h>

class Time
**
public :
Time();
void settime(int,int,int);
void showtime();

private:
int hour;
int minute;
int second;
};

void main()
**
int hr,min,sec;
Time sunset,sunrise;
cout<<" enter sun set time: " ;
cin>>hr>>min>>sec;
sunset.settime(hr,min,sec);
cout<<"\n enter sun rise time: " ;
cin>>hr>>min>>sec;
sunrise.settime(hr,min,sec);

sunset.showtime();
sunrise.showtime();
getch();
}
Time::Time()
**
hour=0;
minute=0;
second=0;
}

void Time::settime(int h,int m,int s)
**
hour=(h>0 && h< 24)? h :0;
minute=(m>0 && m< 60)? m :0;
second=( s>0 && s< 60)? s:0;
}
void Time::showtime()
**
cout<<hour<<":"<<minute<<":"<<second<<endl<<endl;
}




م. قحطان عدنان

Mr.Time1
05-08-2006, 12:38 AM
ما شاء الله اخي موضوع رائع
ودرس موفق
واهنئك على اختيار المثال .. فانا اعتبر هذا المثال هو افضل مثال يمكن تطبيقه لشرح الصفوف
واعتقد ان المثال موجود في كتاب للدكتور صلاح الدوه جي

اتمنى لك التوفيق استاذي الفاضل في تقديم دروس اخرى
واحب اضيف تعليقاتي على الموضوع لكي لا يكون مجرد رد سخيف
__________________________________________________ _______________________
بالنسبة لـ public:
يطلق عليها المبرمجين انها التنصنيف الذي يحتوي على الدوال الاعضاء
اما private:
يطلق عليها المبرمجين بأنها التصنيف الذي يحتوي على المعطيات الاعضاء (والتي لا نرغب بعرض على المستخدم) ولا يمكن استخدامها في البرنامج خارج نطاق الصف نفسه

* يفضل دائما وضع دالة بناء تقوم بإعطاء قيم ابتدائية للمعطيات .. كأصفار مثلاً في مثالك السابق.
*ايضا تطرقت انت إلى انه لايمكن اعطاء قيم ابتدائية للمعطيات وهذا صحيح لكن تطرقت انت انه لا يمكن الا من خلال التوابع , لكن يوجد طريقة اخرى يمكن اعطاء قيم للمعطيات بها بدون التوابع
مثلاً
Time::hour=12
وذلك بالتصريح بأن hour معطى ساكن stitac
هذا والله اعلم
هذا واشكرك على الدرس واتمنى ان يعم النفع كل قرآئه
واتمنى منك الاستزادة