Доступ к свойствам C # против реализации интерфейса - PullRequest
0 голосов
/ 01 апреля 2010

Я пишу класс для представления Pivot Collection, корневого объекта, распознаваемого Pivot. Коллекция имеет несколько атрибутов, список категорий фасетов (каждый представлен объектом FacetCategory) и список элементов (каждый представлен объектом PivotItem). Поэтому чрезвычайно упрощенная коллекция гласит:

public class PivotCollection
{
    private List<FacetCategory> categories;
    private List<PivotItem> items;
    // other attributes
}

В чем я не уверен, так это в том, как правильно предоставить доступ к этим двум спискам. Поскольку порядок объявления категорий фасетов и элементов виден пользователю, я не могу использовать наборы, но класс также не должен допускать дублирование категорий или элементов. Кроме того, я хотел бы сделать объект Collection максимально простым в использовании. Итак, мой выбор:

  1. Имеют PivotCollection, реализуют IList<PivotItem> и имеют методы доступа для FacetCategory: В этом случае можно добавить элемент в коллекцию foo, написав foo.Add(bar). Это работает, но поскольку коллекция - это в равной степени оба вида списков, то есть ее передача только в виде списка для одного типа (категории или элемента) выглядит как решение низкого уровня.

  2. Создание вложенных классов-оболочек для 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.

Вопрос: Какой из этих трех наиболее подходит и почему?

1 Ответ

2 голосов
/ 01 апреля 2010

Лучше всего здесь создать собственный класс коллекции, который наследует System.Collections.ObjectModel.Collection<T> и переопределяет InsertItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...