# فئة الصديق

يمكن لفئة الصديق او العائله في ++c الوصول إلى الأعضاء الخاصة والمحمية للفئة التي تم إعلانها فيها كصديق او كعائله. أحد الاستخدامات المهمة لفئة هذا الكوذ هو أن يكون جزء من بنية البيانات ، الذي يتم تمثيله بواسطة فئة، قادرًا على الوصول إلى الفئة الرئيسية التي تمثل بنية البيانات تلك. تسمح آلية فئة هذا الكود بتتوسيع مساحه التخزين إلى اجزاء، مع الاحتفاظ بالتغليف المناسب كما يراه مستخدمو بنية البيانات.
على غرار فئة الصديق، فإن وظيفة هذا الكود هي وظيفة يتم منحها حق الوصول إلى الأعضاء الخاصة والمحمية للفئة التي تم إعلانها فيها كصديق او شخص كالعائله .
يوضح هذا المثال التالي كيفيه استخدام فئة الأصدقاء لهيكل بيانات الرسم المحدد , حيث يتم تمثيل الرسم المحدد من خلال الرسم المحدد من الدرجه الرئيسية , ويتم تمثيل قمصان الرسم من قبل الفئه

## التغليف

يؤدي الاستخدام الصحيح لفئات الأصدقاء او العائله إلى زيادة التغليف، لأنه يسمح بتوسيع الوصول الخاص لهيكل البيانات إلى أجزائه التي يمتلكها هيكل البيانات بدون السماح بالوصول الى اي فئة خارجية أخرى ليست تابعه لها. بهذه الطريقة تظل بنية البيانات محمية ضد المحاولات العرضية لكسر ثوابت بنية البيانات من الخارج.
من المهم ملاحظة أن الفئة لا يمكنها منح نفسها حق الوصول إلى جزء خاص بفئة أخرى ليست من نطاق فئتها ؛ حيث سيؤدي ذلك إلى كسر التغليف. بل إن الفصل يمنح فصلًا آخر إمكانية الوصول إلى أجزائه الخاصة عن طريق إعلان هذا الفصل كصديق او عائله. في مثال الرسم المحدد ادناه، لا يمكن للرسم البياني أن يعلن نفسه صديقًا لـ Vertex. بدلاً من ذلك، تعلن Vertex أن Graph صديق، وبالتالي توفر لـ Graph إمكانيه الوصول لأماكنها الخاصة.
إن حقيقة أن فئة ما تختار أصدقائها تعني أن الصداقةاو العلاقه ليست متناظرة بشكل عام. في مثال الرسم المحدد، لا يمكن لـ Vertex الوصول لأماكنها الخاصه لفئه غيرها ك Graph، على الرغم من أن Graph يمكنه الوصول إلى الحقول الخاصة لـ Vertex.

## البدائل

يتم توفير ميزة لغوية مماثلة، ولكنها ليست مكافئة، بواسطة كلمة المفتاح المعدلة للوصول internal في لغة C#، والتي تسمح للفئات داخل نفس التجميع بالوصول إلى الأماكن الخاصه او الأجزاء الخاصه للفئات الأخرى. يتوافق هذا مع وضع علامة على كل فئة كصديق او كغيره لفئة أخرى في نفس التجميع؛ فئات الأصدقاء أكثر دقة واشمل .
سيتعين على لغات البرمجة التي تفتقر إلى دعم فئات الأصدقاء او العائليه اللتي لها علاقه ببعضها البعض، أو ميزة لغوية مماثلة، تنفيذ حلول بديلة لتحقيق واجهة آمنة تعتمد على الأجزاء لهيكل البيانات. ومن أمثلة هذه الحلول البديلة:
* جعل حقول الأجزاء عامة. يقلل هذا الحل من التغليف من خلال جعل انتهاك ثوابت بنية البيانات من الخارج أمرًا ممكنًا.
* نقل جميع البيانات الهيكلية القابلة للتغيير بعيدًا عن الجزء إلى بنية البيانات، وإدخال التوجيه غير المباشر مرة أخرى من كل جزء إلى بنية البيانات الخاصة به. يؤدي هذا الحل إلى تغيير تنظيم بنية البيانات، ويزيد من استهلاك الذاكرة في الحالات التي لا تكون فيها هناك حاجة لهذه المعلومات.

## ملكيات

* الصداقات ليست متناظرة, إذا كانت الفئة A صديقة للفئة B ، فإن الفئة B لا تكون صديقة للفئة A تلقائيًا.
* الصداقات ليست عابرة ,إذا كانت الفئة A صديقة للفئة B ، والفئة B صديقة للفئة C ، فإن الفئة A ليست صديقة للفئة C تلقائيًا.
* الصداقات لا تورث , إذا كانت الفئة Base صديقة للفئة X ، فإن الفئة الفرعية Derived ليست صديقة للفئة X تلقائيًا؛ وإذا كانت الفئة X صديقة للفئة Base ، فإن الفئة X ليست صديقة للفئة الفرعية Derived تلقائيًا. ومع ذلك، إذا كانت الفئة Y صديقة للفئة الفرعية Derived ، فسيكون للفئة Y أيضًا إمكانية الوصول إلى الأجزاء المحمية من الفئة Base ، تمامًا كما تفعل الفئة الفرعية Derived .
* وظيفة الصديق

## مراجع

* ↑ "9 More on C++". مؤرشف من الأصل في 2014-06-27.