الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

#Implicit VS Explicit Implementation of Interface in C

بدأه AliBazzi في 20 مارس 2010 · 0 رد · 1,045 مشاهدة · في قسم تكنولوجيا Microsoft .NET العام
مشاركة: واتساب X فيسبوك تيليجرام
#1

ما يقصد بـ Implicit or Explicit Interface Implementation هو كيفية تطبيق الـ Type خاصتك وتضمينه لأي Interface , فهناك طريقتان كما هو واضح من عنوان المقال , المبطن و الصريح , الفرق و إستعمالات كل طريقة هو هدف هذا المقال ,فلنبدأ :

لو عرفنا الـ Interface التالية البسيطة التي تحوي Execute و Initialize :

1.png

ولدينا الـ Bubble Sort Class الذي سيطبق هذه الـ Interface , كما سنلاحظ في الشكل التالي , سيقترح الـ Visual Studio طريقتين لفعل ذلك :

0.png

1- Implement Interface Algorithm

2-Explicitly Implement Interface Algorithm

لو إخترنا الطريقة الأولى , سيكون الناتج كالتالي :

2.PNG

والاّن لو حاولنا أن نقوم بعملية إستدعاء للـ Execute Method ستكون النتيجة كالمتوقع , فنستطيع إستدعاء الـ Execute أو الـ Initialize :

7.png

إلى الاّن الكلام سليم , وبصراحة هذا ما نعرفه و تعودنا عليه , لكن لو قمنا بإختيار الخيار الثاني , أي Explicit Interface Implementation فسيكون النتيجة أشبه بالتالي :

3.PNG

وحاولنا الاّن عمل شيء كالتالي :

4.png

ما حصل هو عدم قدرتنا على إستدعاء الـ Execute والـ Initialize , وهما العضوان اللذان ضمنّاهما في الـ Type خاصتنا Explicitly !

نستطيع الوصول إليهما عن طريق عمل Casting للـ Object الذي يطبق Interface معينة ,فتكون النتيجة مقبولة كالتالي :

5.png

ولكن لو على فرض كنا نملك Method إسمها Sort وتقبل في توقيعها Object يطبق IAlgorithm لما إحتجنا للـ Casting , والدليل :

6.png

والاّن لو ناقشنا ما يحصل كبنية تحتية و الفروقات بين الطريقتين في تضمين أي Interface :

أولا : عند تضمين الـ Interface على إنها Implicit فسيقوم الـ CLR بالبحث عن أعضاء الـ Interface وربطها مع تعريفها , فمثلا المثال السابق , سيحاول البحث عن Execute و Initialize لهم نفس التوقيع الذي تحتاجه الـ Interface و يكون محدد وصوله Public .

بينما لو كانت Explicit فالـ Interface مربوطة بشكل صريح و تام لا داعي فيه للبحث من قبل الـ CLR عن الـ Method المناسبة ,وبالإضافة لذلك , فهناك فائدة عظيمة و هي إمكانية تطبيق أكثر من Interface لديها Members تحوي نفس الإسم و التوقيع , فتخيلو لو كان لدينا IExecutable إضافة للـ IAlgorithm ,والإثنتين تحويان Execute ونفس التوقيع , فسيكون لدينا الشكل التالي :

8.PNG

وبالتالي سيتم تنفيذ الـ Execute الخاصة بكل Interface عند معرفة السياق الذي نعمل فيه تلقائيا كالتالي :

9.PNG

(ولا يمكن حدوث حالات إشتباه هنا , لعدم قدرة أحد على إستدعاء أي من الـ Execute إلا إذا قام بتعريف النطاق الذي يعمل به , عن طريق الـ Casting للـ Interface المناسبة )

ولكن لو قمنا بتضمين الـ Interfaces السابقتين كـ Implicit فسنلاحظ إشتراك الـ Interfaces في Method الـ Execute ,وبالتالي لا يمكن وجود إستقلالية في الـ Implementation الخاصة بكل Interface , فهما مجبرتان على تشاركهما في نفس الـ Execute كالتالي :

10.PNG

هذه الحالة مفيدة إذا كان ما تقوم بتطبيقه هو فعلا يحمل نفس المعنى , إي أن ما ستقوم به الـ Execute الخاصة بالـ Two Interfaces هو نفسه تماما ...

ثانيا : يأخذ عادة إسلوب تضمين الـ Explicit Interfaces على أنه إسلوب يحمل قيمة جمالية للـ Code , لو تخيلنا مثال عن Type يضمّن Interface تحوي عدد كبير نسبيا من الـ members (على سبيل المثال 10 Methods ) وقمنا بتضمينهم Explicitly فإننا سنجعل الـ Type أكثر جمالا ( أو كما يقال نظافة ;) )خصوصا إذا كانت تلك الـ Interface لا تمت مباشرة للـ Type من ناحية وظيفته الأساسية , فيفضل تضمينها Explicitly ... بينما إذا كانت تمت للموضوع بشكل مباشر (كالـ Collections التي تقوم بتضمين IList ) فيفضل أن تضمّن Implicitly , لكي يسهل الوصول إليها مباشرة , دون عمل Casting ...

بإنتظار الأسئلة ...أرجو الفائدة للجيمع :mrgreen:

1

مواضيع مشابهة