سؤال

كنت أحاول تنفيذ مجموعة متخصصة تعمل مثل ObservableCollection لتغليف المزيد من الآليات فيه، وللقيام بذلك، تركت مجموعتي ترث منه أيضًا Collection وأقوم أيضًا بتنفيذ نفس الواجهات.

أنا لا أفهم كيف يمكن للمرء أن ينفذ فعليًا منطق تغيير المجموعة بالكامل، على سبيل المثال Collection<T>.Add لم يتم تجاوزه (لم يتم وضع علامة عليه على أنه افتراضي)، فكيف يمكن لـ ObservableCollection أطلق النار على CollectionChanged الحدث إذا تمت إضافة العناصر باستخدام هذه الطريقة؟

هل كانت مفيدة؟

المحلول

للإجابة على سؤالك المحدد، Collection<T>.Add يدعو InsertItem الطريقة الافتراضية (بعد التأكد من أن المجموعة ليست للقراءة فقط). ObservableCollection<T> في الواقع يتجاوز هذه الطريقة للقيام بالإدراج و رفع إشعارات التغيير ذات الصلة.

نصائح أخرى

يفعل ذلك عن طريق الاتصال InsertItem والذي تم تجاوزه ويمكن رؤيته عند إلغاء الترجمة

protected override void InsertItem(int index, T item)
{
    this.CheckReentrancy();
    base.InsertItem(index, item);
    this.OnPropertyChanged("Count");
    this.OnPropertyChanged("Item[]");
    this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index);
}

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top