Сложная коллекция изменена на класс - лучший способ справиться с этим - PullRequest
1 голос
/ 17 марта 2010

В моем проекте я использую довольно сложную (и вложенную) коллекцию:

List<Pair<List<Pair<double>>, double>> myCollection

Поскольку я использую его таким же образом в нескольких местах в моем проекте, я хотел бы преобразовать его в новый класс. Но у меня есть некоторые сомнения ...

Каков наилучший способ обработки коллекций такого типа, создания внутреннего поля и передачи в качестве общедоступных только выбранных элементов:

public class MyComplicatedCollection
{
    private List<Pair<List<Pair<double>>, double>> myInnerCollection = null;

    // Here come some constructors, data accessors etc... only to those elements which I would like to pass as public.
}

Или, может быть, другим путем, получая оригинальную коллекцию:

public class MyComplicatedCollection : List<Pair<List<Pair<double>>, double>>
{

    // Here come some constructors, 
    // Most of the data accessors are given "out of the box"
}

Второй способ кажется более простым, но не таким безопасным, как первый. Другое дело производительность - эти коллекции действительно большие, и мне нужен довольно быстрый доступ к ним - это очень важно.

И второй вопрос: если второй способ лучше ... Для List есть конструктор, когда вы можете заполнить свою коллекцию, передав любой ICollection. Есть ли простой способ создать такой конструктор для моего класса, или мне нужно заполнить элемент моей коллекции элементом (или с помощью метода AddRange)?

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

В случае сомнений используйте композицию. Наследование трудно сделать правильно, и вы должны использовать его, только если у вас должно есть отношение IS-A между вашим новым типом и базовым / составным типом. В этом случае я думаю, что композиция (т. Е. Ваш первый пример) - лучшее решение.

Композиция дает вам гибкость для создания вашего шрифта с любым открытым интерфейсом, который вы пожелаете. Наследование определяет этот интерфейс для вас, а также создает тесную связь между вашим новым типом и его базовым типом, что может затруднить будущие модификации.

1 голос
/ 17 марта 2010

Упаковка коллекции даст вам лучший контроль и, следовательно, меньше шансов на появление ошибок, чем унаследованная версия. Это также позволит вам скрыть или скрыть сложность коллекции. Например, вы можете создавать свои собственные методы доступа и свойства.

В плане производительности вы не навредите себе, оборачивая коллекцию. Класс обертки действительно является очень тонким слоем над данными сбора и не должен влиять на производительность.

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