واجهة لا تعد ولا تحصى
-
10-07-2019 - |
سؤال
أنا لا أفهم لماذا IList
ينفذ IEnumerable
مع الأخذ في الاعتبار ذلك IList
ينفذ ICollection
الذي ينفذ IEnumerable
أيضًا.
المحلول
وأفترض أنك تريد أن تعرف لماذا تعلن أنها تطبق ICollection
وكذلك IEnumerable
، عندما أولا يعني الثانية. وأظن أن السبب الرئيسي هو وضوح: يعني الناس ليسوا بحاجة أن ننظر إلى الوراء لICollection
للتأكد من أن الذي يمتد بالفعل IEnumerable
وهناك أوقات أخرى عندما تحتاج إلى redeclare على تطبيق واجهة، إذا كنت ترغب في إعادة تنفيذ-طريقة اجهة التي تم تنفيذها سابقا صراحة في الفئة الأساسية - ولكن لا أعتقد أن هذا هو السبب في هذه الحالة <. / P>
تحرير: لقد تم افتراض أن التعليمات البرمجية المصدر التي يتم بناؤها مستندات من لديه تصريح بما في ذلك الواجهات. بديل آخر محتمل هو أن <م> جميع م> الواجهات في التسلسل الهرمي يتم سحبها تلقائيا في قبل مولد الوثيقة وفي هذه الحالة يصبح السؤال "لماذا المولد وثيقة نفعل ذلك." - والجواب هو لا يزال من شبه المؤكد "وضوح"
نصائح أخرى
IList
ينفذ فقط IEnumerable
بواسطة رابطة.أي.ينفذ IEnumerable
بدقة لأن يرث ICollection
الذي IEnumerable
.ستحصل على الشيء نفسه مع التسلسلات الهرمية للأنواع (على الرغم من الميراث الفردي فقط:
class Enumerable {}
class Collection : Enumerable {}
class List : Collection {}
لذا List
هو Enumerable
;بنفس الطريقة، IList
يكون IEnumerable
.
مثلا لو كتبت:
interface IA {}
interface IB : IA { }
interface IC : IB { }
وانظر إلى البيانات الوصفية، فيبدو أن ذلك IC : IA, IB
- ولكن هذا غير مباشر فقط؛وهنا إيل:
.class private interface abstract auto ansi IA
{
}
.class private interface abstract auto ansi IB
implements IA
{
}
.class private interface abstract auto ansi IC
implements IB, IA
{
}
إذا كنت لفتح رمز في ReSharper، فإنه يشير إلى أن إعلان واجهة IEnumerable
على IList
لم يكن مطلوبا، ويتم تحديد ذلك بالفعل عبر ICollection
.