Шаблон декоратора в списке‹T› для DataGridView

Я хотел бы применить класс Decorator к списку и иметь возможность привязать его к WinForms DataGridView.

Я хотел бы знать, какие члены списка мне нужно реализовать для этого нового класса, чтобы иметь возможность привязать его к DataGridView?

Некоторые из методов из списка я бы скрыл с помощью моих методов декорированного класса, а другие я бы просто назвал _decoratedList.Method().

Является ли это вариантом для реализации декоратора в типе списка?

Декоратор (теперь изменен на использование IList):

public class MyCustomList : IList<MyObject>
{
  IList<MyObject> _decoratedList = new List<MyObject>; 

  // implementing all the required method with _decoratedList.BaseMathodName()
.
.
.
}

Идея состоит в том, чтобы иметь класс, который я могу просто привязать в качестве источника данных к DataGridView, использовать нужные мне методы списка, а не писать их все самостоятельно, и добавить несколько новых методов в этот новый класс.


person elector    schedule 25.02.2011    source источник
comment
какую платформу вы используете? wpf silverlight asp.net winforms?   -  person k3b    schedule 25.02.2011
comment
WinForms Я хотел бы связать этот новый класс с компонентом DataGridView.   -  person elector    schedule 25.02.2011


Ответы (1)


как минимум, ему просто нужно IList. Поскольку вы наследуете List<T>, вы получаете это бесплатно, но обратите внимание, что наследование != декоратор, и обратите внимание, что List<T> не имеет виртуальных методов (хотя Collection<T> есть), поэтому вы не можете настроить... ничего многое, унаследовав List<T>.

К счастью, вы можете создать простой псевдодекоратор, реализовав IListSource (но ручная реализация IList предпочтительнее), так как IListSource используется в первую очередь. Для метаданных типа нужен либо типизированный (не объектный) индексатор, либо ITypedList (сложнее) — так:

public SomeType this[int index] { get {...} }

другие необязательные интересные интерфейсы включают IBindingList, IBindingListView и ряд других для побочных функций; IRaiseItemChangedEvents и ICancelAddNew например.

person Marc Gravell    schedule 25.02.2011
comment
Спасибо, Марк. Я бы предпочел иметь List‹MyObject› в качестве класса-предка, потому что тогда я бы просто вызвал _decoratedList.Method() для нового введенного метода. Я просто хотел бы знать, что мне нужно от Decorator для работы привязки DataGridView? - person elector; 25.02.2011
comment
@elector вещи, упомянутые выше ;p - person Marc Gravell; 25.02.2011
comment
@elector - вы знаете, что у вас есть два списка, верно? вы являетесь списком, а в списке есть список... - person Marc Gravell; 25.02.2011
comment
@ Марк Я знаю о списках, я думаю, это то, что делает его декоратором, не так ли? Так вы говорите, что мне нужно использовать Collection‹T› вместо List‹T›? - person elector; 25.02.2011
comment
@Mark Что будет, если я использую IList‹T› для предка? - person elector; 25.02.2011
comment
@elector - даже если вы указываете его как IList<T>, dgv заботится только о object, а объект должен реализовывать неуниверсальный IList - person Marc Gravell; 25.02.2011
comment
@elector - декоратор; Я ожидаю, что декоратор будет инкапсулировать только, то есть обернуть конкретный список, а не быть конкретным списком - person Marc Gravell; 25.02.2011
comment
@Marc Спасибо, Марк, я действительно ценю твои ответы, но они просто абстрактны для меня. Я не понимаю, что вы говорите в последнем комментарии. Извини. - person elector; 25.02.2011
comment
@elector - ах, верно - вы изменили вопрос. Теперь, когда вы реализуете IList<T>, а не наследуете List<T>, это выглядит как декоратор. Но вам все равно нужно реализовать неуниверсальный IList, чтобы он работал. - person Marc Gravell; 25.02.2011
comment
@Marc Марк Да, я изменил вопрос после того, как посмотрел определение декоратора. Но я до сих пор не понимаю реализацию IList. Где реализовать? Спасибо - person elector; 25.02.2011
comment
@elector для всего, что вы даете DataGridView, то есть grid.DataSource = obj, тогда obj должен либо реализовать IList, либо должен реализовать IListSource для генерирования IList - person Marc Gravell; 25.02.2011
comment
@Марк, значит, мой декоратор тоже должен наследоваться от IList? открытый класс MyCustomList: IList‹MyObject›, IList? И реализовать его членов? - person elector; 25.02.2011
comment
да (ну, правильнее было бы реализовать, а не наследовать - но да). Если у вас есть диапазон декораторов и вы не хотите делать это для каждого, вы можете написать декорирование, которое обертывает IList<T> и предоставляет IList, и просто реализуете IListSource для каждого , возвращая это. Если у вас есть только один декоратор, просто реализуйте IList напрямую. - person Marc Gravell; 25.02.2011