Мне нужны специализированные коллекции классов. Давайте назовем их FooItems и BarItems.
Мне в основном нужны все функции Списка, но мне нужно проделать дополнительную работу, когда новые элементы добавляются или удаляются из коллекции.
Моим первым достижением было просто извлечь из List и List, а затем создать мои собственные методы Add и Remove. Это, конечно, создает побочный эффект, скрывающий функцию, и компилятор предлагает использовать ключевое слово «new», чтобы явно скрыть базовые классы.
public class FooCollection : List<Foo>
{
public new void Add(Foo foo)
{
// Do my work then...
base.Add(foo);
}
}
Хотя это воняет. Это может вызвать проблемы, если кто-то ссылается на коллекцию FooCollection через ссылку List или IList, поскольку она не будет вызывать мою (не виртуальную) функцию Add, а скорее версию List.
Конечно, в моем текущем коде это вряд ли произойдет ... но никто не может предсказать будущее.
Другой вариант, конечно, состоит в том, чтобы повторно реализовать Интерфейс IList и содержать Список, но воняет нарушением DRY (и это также много работы, особенно для нескольких коллекций).
Я уже склоняюсь к сдерживанию как предпочтительному методу ... просто интересно, есть ли у кого-нибудь еще какие-то комментарии по этому вопросу.