C++التغليف
- مفهوم التغليف
- أمثلة شاملة حول التغليف
مفهوم التغليف
التغليف ( Encapsulation ) عبارة عن أسلوب يمكن اتباعه لإخفاء خصائص الكلاس ( Global Variables ) و جعل الكائنات التي تنشئها منه و الكلاسات الأخرى التي تقوم بتضمينه قادرة على التعامل مع هذه الخصائص فقط من خلال دوال يقوم بإنشائها المبرمج الأساسي للكلاس.
إذاً فائدة التغليف أنه يتيح لك وضع شروط لتخزين القيم في الخصائص, كما أنه يتيح لك الحصول على القيم بالطريقة التي تريدها.
الأسلوب المتبع في عملية التغليف
بما أن فكرة التغليف الأساسية هي إخفاء البيانات من جهة و إتاحة التعامل معها من جهة أخرى.
أول ما يجب أن يخطر في بالك هو أنه يجب جعل نوع جميع الخصائص ( أي المتغيرات التي ستحفظ البيانات ) الموجودة في الكلاس private لأن تعريف جعلها private يعني أنه يمكن الوصول إليهم فقط من داخل الكلاس الموجودين فيه.
ثاني شيىء عليك التفكير فيه هو إيجاد طريقة للوصول إلى هذه الخصائص من الخارج.
لفعل ذلك عليك تجهيز دوال نوعها public للتعامل مع هذه الخصائص, لأن الدوال التي نوعها public يمكن الوصول إليهم من أي مكان.
إذاً لتحقيق مبدأ التغليف, عليك جعل نوع الخصائص private و جعل نوع الدوال التي تستخدم للوصول إليهم public.
مفهوم دوال الـ Setter و الـ Getter
عند التعامل مع أي متغير ( أو خاصية ) فعندك خيارين و هما إما إعطاءه قيمة جديدة و إما الحصول على القيمة الموجودة فيه.
بما أنه يجب بناء دوال للتعامل مع كل خاصية من الخصائص الموجودة في الكلاس, ينصح بإعتماد أسماء متعارف عليها كالتالي:
- إبدأ إسم كل دالة الهدف منها إعطاء قيمة للخاصية بالكلمة set ثم إسم الخاصية.
- إبدأ إسم كل دالة الهدف منها الحصول على قيمة الخاصية بالكلمة get ثم إسم الخاصية.
أمثلة شاملة حول التغليف
الآن سنقوم بإنشاء كلاس إسمه Employee و فكرته تخزين معلومات الموظفين مثل الإسم name, الراتب salary, العمر age.
بعدها سنقوم بتجربة إنشاء كائن من الكلاس Employee في الدالة main() و التعامل معه.
ملاحظة: هنا قمنا بتعريف كل شيء بشكل عادي بدون تطبيق أي مبدأ من مبادئ التغليف.
المثال الأول
سنحصل على النتيجة التالية عند التشغيل.
الآن سنقوم بإعادة المثال السابق مع جعل نوع الخصائص private و سنقوم بتعريف دوال نوعها public للتعامل مع هذه الخصائص.
ملاحظة: في هذا المثال قمنا بتطبيق مبدأ التغليف.
المثال الثاني
سنحصل على النتيجة التالية عند التشغيل.
الآن سنعيد المثال السابق مع إضافة شرط على الدالة setName()
يحدد أنه عند إدخال الإسم يجب أن يتألف من أكثر من حرفين.
و إضافة شرط على الدالة getName()
لجعلها ترجع Not defined
إذا كان لا يوجد إسم مدخل في الخاصية name
.
ملاحظة: قمنا بتعليم الشروط و التعديلات الجديدة باللون الأصفر.
المثال الثالث
سنحصل على النتيجة التالية عند التشغيل.
لاحظ أنه لم يقبل الإسم الذي أدخلناه عن طريق الدالة setName()
لأنه أصغر من ثلاثة أحرف, لذلك طبع الرسالة التي قمنا بتجهيزها في حال تم إدخال إسم أصغر من ثلاثة أحرف.
• و بما أنه لم يضع الإسم الذي قمنا بإدخاله في الخاصية name
لاحظ أن الدالة getName()
قامت بإرجاع القيمة Not defined
التي قمنا بتجهيزها في حال لم يتم إدخال أي إسم فيه.