Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > List<>.Add


Автор: Bogdan1024 6.7.2007, 12:12
Есть класс, унаследованный от  List<SomeObject>. Как в нём реализовать метод .Add так, чтобы никаким образом нельзя было вызывать родной метод List<>.Add? Нужно чтобы все объекты SomeObject в списке были с уникальным полем Name.

Автор: QryStaL 6.7.2007, 13:12
Наследованием не получится, так как public void Add(T item) {} невиртуальный. Можно List обернуть в свой класс и там реализовывать...

Автор: Bogdan1024 6.7.2007, 13:25
Да, на самом деле не круто скрывать родной .Add. Какой же это наследник List<SomeObject>, если он не является полнофункциональным List<SomeObject>. 
Быть может можно запретить каст от Класса-наследника к  List<SomeObject>? Кидать эксцепшн при касте, например?

Автор: Bogdan1024 6.7.2007, 13:43
Не, переопределить каст нельзя. Ладно, прийдётся переделать класс.

Автор: mr.DUDA 6.7.2007, 20:25
Можно отнаследоваться и сделать метод public new Add с такими же аргументами как в методе который хотим скрыть. И уже в этом переопределённом методе кидать исключение. Хотя это не избавит от того что юзер может привести к IList<T> и дёргать Add через интерфейс  smile 

Конечно, лучше будет создать обёртку - свой класс наследующий интерфейс IList<T>, содержащий поле типа List<T> и все методы кроме Add перенаправляющий в List. А метод Add реализовать явно (не public а private IList<T>.Add), тогда его просто не будет видно. В остальном это получится 100% тот же класс-список, к тому же не так уж и много методов в IList.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)