هل يمكننا استخدام getEnumerator () دون استخدام واجهة ienumerable؟
-
04-10-2019 - |
سؤال
لدي فصل يسمى Primes وهذا الفصل ينفذ getEnumerator () دون تنفيذ واجهة iEnumerable.
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public IEnumerator GetEnumerator()
{...}
انا لم احصل عليها. هل فاتني شيء؟
المحلول
أولاً ، كما قال آخرون ، يمكنك تقديم أساليبك الخاصة دون تنفيذ واجهات على أي حال - يمكنك كتابة خاص بك Dispose
الطريقة دون تنفيذ IDisposable
وما إلى ذلك بالنسبة للواجهات المعروفة ، أقترح أن تكون هذه فكرة سيئة تقريبًا (لأن القراء سيكون لديهم توقعات معينة) ولكنها صالحة تمامًا.
الأهم من ذلك ، foreach
بيان في ج# يستطيع العمل بدون IEnumerable
كونه متورط مشترك. يقوم المترجم بفعالية بكتابة بطة وقت التجميع على الأسماء GetEnumerator()
, Current
و MoveNext()
. كان هذا في المقام الأول للسماح بالتكرار القوي (وغير الملاكمة) في C# 1 ، قبل الأدوية. انظر القسم 8.8.4 من المواصفات C# 3 لمزيد من التفاصيل.
ومع ذلك ، من السيئ عمومًا القيام بذلك الآن إذا كنت فعل تريد أن تكون قادرًا على التكرار بسهولة على محتويات مثيل كمجموعة - وأنا أقترح بالفعل التنفيذ IEnumerable<T>
بدلا من مجرد IEnumerable
.
نصائح أخرى
نعم يمكنك. حتى يمكنك استخدامه في foreach
. المشكلة الوحيدة التي لا يمكن إلقائها على المشكلة IEnumerable
على الرغم من أنها تنفذ طريقة مطلوبة.
لا يوجد سبب لتنفيذك IEnumerable
من أجل إنشاء وظيفة تسمى GetEnumerator
هذا يعيد IEnumerator
, ، هذا يعني فقط أنك لن تتمكن من توفير مثيل من هذا النوع إلى شيء يتوقع IEnumerable
.
تضمن الواجهة عقدًا ، وهذا لا يعني أنه لا يمكن أن يكون لديك طريقة بنفس التوقيع مثل الواجهة في الواجهة على فئة لا تعرض الواجهة.