AudaNix

8.3. محددات الوصول العامة والخاصة

2 ردود في هذا الموضوع

2.محددات الوصول العامة والخاصة Public vs private access specifiers

القى نظرة على هيكل البيانات التالى struct:

struct DateStruct
{
int nMonth;
int nDay;
int nYear;
};

int main()
{
DateStruct sDate;
sDate.nMonth = 10;
sDate.nDay = 14;
sDate.nYear = 2020;

return 0;
}

فى هذا البرنامج تم اﻻعلان عن DateStruct ثم قمنا بالوصول الى مباشرا الى كل اﻻعضاء الخاصة بة لكي نعين لهم القيم المبدئية. هذا يعمل ويتم ﻻن كل اعضاء هيكل البيانات struct اعضاء عامة. اﻻعضاء العالمة هى اعضاء سواء فى هيكل البيانات او الفئة التى يمكن الوصول بواسطة اي دالة فى البرنامج.

ونأتى الى الجانب اﻵخر ، القى نظرة على الكود التالي الذي يشبة الكود السابق الى حد التطابق:

class Date
{
int m_nMonth;
int m_nDay;
int m_nYear;
};

int main()
{
Date cDate;
cDate.m_nMonth = 10;
cDate.m_nDay = 14;
cDate.m_nYear = 2020;

return 0;
}

اذا قمت بترجمة الكود السابق سوف تحصل على خطأ هذا بسبب ان كل المتغيرات فى فئة بشكل افتراضى تكون اعضاء خاصة وليست عامة. اﻻعضاء الخاصة هى اعضاء فى الفئة التى يمكن الوصول فقط عن طريق الدوال اﻻعضاء بدال الفئة نفسها. وﻻن الدالة الرئيسية main() ليست دالة عضو فى الفئة Date وبالتالي لن يسمح لها بالوصول الى اﻻعضاء الخاصة التى بداخل الفئة Date.

على الرغم من ان اعضاء الفئة بشكل افتراضي تكون خاصة private اﻻ انة يمكن تحويلهم الى اعضاء عامة بأستخدام الكلمة الحاكمة public .

class Date
{
public:
int m_nMonth; // عام
int m_nDay; // عام
int m_nYear; // عام
};

int main()
{
Date cDate;
cDate.m_nMonth = 10; // ﻻ مشكلة يعمل ﻻن m_nMonth عام
cDate.m_nDay = 14; // ﻻ مشكلة يعمل ﻻن m_nDay عام
cDate.m_nYear = 2020; // ﻻ مشكلة يعمل ﻻن m_nYear عام

return 0;
}

ولئن اعضاء الفئة Date اصبحت عامة، فيمكن للدالة main() الوصول لهم.

واحد من اﻻختلافات اﻻساسية بين الفئات وهياكل البيانات ان فى الفئات تمكننا استخدام محددات الوصول بشكل واضح لكي نحدد لمن يمكنة الوصول الى اعضاء الفئة. يوجد فى سي++ ثلاثة محددات وصول مختلفة والكلمات الحاكمة لهم بالترتيب: public و private و protected اى عام و خاص و محمى. سوف نناقش محدد الوصول المحمي protected عندما نصل الى فصل الوراثة فى سي++.

هنا مثال لفئة تستخدم كل الثلاثة محددات الوصول:

class Access
{
int m_nA; // خاص بشكل افتراضي
int GetA() { return m_nA; } // خاص بشكل افتراضي

private:
int m_nB; // خاص
int GetB() { return m_nB; } // خاص

protected:
int m_nC; // محمى
int GetC() { return m_nC; } // محمى

public:
int m_nD; // عام
int GetD() { return m_nD; } // عام

};

int main()
{
Access cAccess;
cAccess.m_nD = 5; //يعمل ﻻنm_nD عام
std::cout << cAccess.GetD(); // اوك يعلم ﻻن GetD() عام

cAccess.m_nA = 2; // خطأ ﻻن m_nA خاص
std::cout << cAccess.GetB(); // خطأ ﻻن GetB() خاص

return 0;
}

كل واحد من اﻻعضاء يكتسب مستوي الوصول من محدد الوصول السابق لة او الذي يتبعة. والتقليد الشائع هو اضافة اﻻعضاء الخاصة اوﻻ.

لما الحاجة احيانا الى منع الوصول الى اعضاء الفئة؟ غالبا ﻻنك بحاجة للأعلان عن اعضاء تستخدم داخليا فى الفئة فقط وليس خارجها. مثال، عند كتابة فئة لمعالجة السلاسل النصية طبيعى انك تعلن عن عضو خاص يسمي m_nLength يحمل طول السلسلة النصية . اذا كان m_nLength عام فأن اي دالة او اي احد يستخدم فئتك يمكنة تغيير طول السلسلة النصية بدون تغير فعلي فى السلسلة النصية! وهذا ممكن يسبب كارثة لبرنامجك. وبناء على ذلك فان m_nLength عندما يكون عضو خاص فلن يستطيع أحد التعديل علية اﻷ الدوال التى بداخل الفئة فقط.

ان مجموعة اﻻعضاء العامة فى الفئة غالبا يشار اليها بأنها واجهة عامة . ﻻنه فقط اﻻعضاء العامة يمكن الوصول اليهم من خارج الفئة، والواجهة العامة تحدد كيف يستخدم البرنامج الفئة وكيف يتفاعل معها.

الدرس التالي: 8.4. دوال الوصول والتغليف

أذهب الي:المقدمة والفهرس الرئيس

الدرس السابق: 8.2. الفئات والدوال الاعضاء

تم تعديل بواسطه محمد عودة
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
واحد من اﻻختلافات اﻻساسية بين الفئات وهياكل البيانات ان فى الفئات تمكننا استخدام محددات الوصول بشكل واضح لكي نحدد لمن يمكنة الوصول الى اعضاء الفئة.

لم أكن أعلم ذلك ... بارك الله فيك ...ثابر ...

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .