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

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

1- Implement Interface Algorithm
2-Explicitly Implement Interface Algorithm
لو إخترنا الطريقة الأولى , سيكون الناتج كالتالي :
والاّن لو حاولنا أن نقوم بعملية إستدعاء للـ Execute Method ستكون النتيجة كالمتوقع , فنستطيع إستدعاء الـ Execute أو الـ Initialize :

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

ما حصل هو عدم قدرتنا على إستدعاء الـ Execute والـ Initialize , وهما العضوان اللذان ضمنّاهما في الـ Type خاصتنا Explicitly !
نستطيع الوصول إليهما عن طريق عمل Casting للـ Object الذي يطبق Interface معينة ,فتكون النتيجة مقبولة كالتالي :

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

والاّن لو ناقشنا ما يحصل كبنية تحتية و الفروقات بين الطريقتين في تضمين أي Interface :
أولا : عند تضمين الـ Interface على إنها Implicit فسيقوم الـ CLR بالبحث عن أعضاء الـ Interface وربطها مع تعريفها , فمثلا المثال السابق , سيحاول البحث عن Execute و Initialize لهم نفس التوقيع الذي تحتاجه الـ Interface و يكون محدد وصوله Public .
بينما لو كانت Explicit فالـ Interface مربوطة بشكل صريح و تام لا داعي فيه للبحث من قبل الـ CLR عن الـ Method المناسبة ,وبالإضافة لذلك , فهناك فائدة عظيمة و هي إمكانية تطبيق أكثر من Interface لديها Members تحوي نفس الإسم و التوقيع , فتخيلو لو كان لدينا IExecutable إضافة للـ IAlgorithm ,والإثنتين تحويان Execute ونفس التوقيع , فسيكون لدينا الشكل التالي :
وبالتالي سيتم تنفيذ الـ Execute الخاصة بكل Interface عند معرفة السياق الذي نعمل فيه تلقائيا كالتالي :
(ولا يمكن حدوث حالات إشتباه هنا , لعدم قدرة أحد على إستدعاء أي من الـ Execute إلا إذا قام بتعريف النطاق الذي يعمل به , عن طريق الـ Casting للـ Interface المناسبة )
ولكن لو قمنا بتضمين الـ Interfaces السابقتين كـ Implicit فسنلاحظ إشتراك الـ Interfaces في Method الـ Execute ,وبالتالي لا يمكن وجود إستقلالية في الـ Implementation الخاصة بكل Interface , فهما مجبرتان على تشاركهما في نفس الـ Execute كالتالي :
هذه الحالة مفيدة إذا كان ما تقوم بتطبيقه هو فعلا يحمل نفس المعنى , إي أن ما ستقوم به الـ Execute الخاصة بالـ Two Interfaces هو نفسه تماما ...
ثانيا : يأخذ عادة إسلوب تضمين الـ Explicit Interfaces على أنه إسلوب يحمل قيمة جمالية للـ Code , لو تخيلنا مثال عن Type يضمّن Interface تحوي عدد كبير نسبيا من الـ members (على سبيل المثال 10 Methods ) وقمنا بتضمينهم Explicitly فإننا سنجعل الـ Type أكثر جمالا ( أو كما يقال نظافة ;) )خصوصا إذا كانت تلك الـ Interface لا تمت مباشرة للـ Type من ناحية وظيفته الأساسية , فيفضل تضمينها Explicitly ... بينما إذا كانت تمت للموضوع بشكل مباشر (كالـ Collections التي تقوم بتضمين IList ) فيفضل أن تضمّن Implicitly , لكي يسهل الوصول إليها مباشرة , دون عمل Casting ...
بإنتظار الأسئلة ...أرجو الفائدة للجيمع :mrgreen: