Я пишу класс для представления Pivot Collection, корневого объекта, распознаваемого Pivot. Коллекция имеет несколько атрибутов, список категорий фасетов (каждый представлен объектом FacetCategory
) и список элементов (каждый представлен объектом PivotItem
). Поэтому чрезвычайно упрощенная коллекция гласит:
public class PivotCollection
{
private List<FacetCategory> categories;
private List<PivotItem> items;
// other attributes
}
В чем я не уверен, так это в том, как правильно предоставить доступ к этим двум спискам. Поскольку порядок объявления категорий фасетов и элементов виден пользователю, я не могу использовать наборы, но класс также не должен допускать дублирование категорий или элементов. Кроме того, я хотел бы сделать объект Collection максимально простым в использовании. Итак, мой выбор:
Имеют PivotCollection
, реализуют IList<PivotItem>
и имеют методы доступа для FacetCategory
: В этом случае можно добавить элемент в коллекцию foo
, написав foo.Add(bar)
. Это работает, но поскольку коллекция - это в равной степени оба вида списков, то есть ее передача только в виде списка для одного типа (категории или элемента) выглядит как решение низкого уровня.
Создание вложенных классов-оболочек для List
(CategoryList
и ItemList
). Это имеет преимущество в создании согласованного интерфейса, но недостатком является то, что эти свойства больше не смогут служить списками (потому что мне нужно переопределить не виртуальный Add
метод, который я должен реализовать IList
вместо подкласса List
. Неявное приведение не будет работать, потому что это вернет метод Add
к его нормальному поведению.
Кроме того, по причинам, которые я не могу понять, IList
отсутствует метод AddRange
...
public class PivotCollection
{
private class CategoryList: IList<FacetCategory>
{
// ...
}
private readonly CategoryList categories = new CategoryList();
private readonly ItemList items = new ItemList();
public CategoryList FacetCategories
{
get { return categories; }
set { categories.Clear(); categories.AddRange(value); }
}
public ItemList Items
{
get { return items; }
set { items.Clear(); items.AddRange(value); }
}
}
Наконец, третий вариант заключается в объединении параметров один и два, так что PivotCollection
реализует IList<PivotItem>
и имеет свойство FacetCategories
.
Вопрос: Какой из этих трех наиболее подходит и почему?