Несколько вещей.
Наличие дополнительного типа ( ProductList
) требует небольших накладных расходов, но ничего особенного. Но это на самом деле зависит от того, что вы хотите сделать. Во многих отношениях ProductList
по-прежнему является плохой идеей, поскольку он сжигает List
в общедоступном API, а List
не очень расширяемый (например, ни один из методов не является виртуальным
). Коллекция
может иметь больше возможностей расширения.
Я бы поспорил в пользу абстракции или инкапсуляции:
public static IList<Product> GetProductList() {...} // abstraction; can return
// List<Product> if we want
или:
public class ProductList : IList<Product> {...} // encapsulation, but need to
// add a lot of dull code
Жаль, что C # не выполняет инкапсуляцию подход простой (я думаю "миксины").
Обратите внимание, что еще один прием (иногда подходящий,
Целью дженериков, среди прочего, было продвижение повторного использования кода. Ваш первый подход более чем уместен.
Я когда-либо использовал второй подход только тогда, когда мне приходилось добавлять реализации интерфейса в коллекцию (например, IDisposable), добавлять дополнительные функции или сериализовать коллекцию в xaml.
Если вы планируете добавить в список функциональные возможности, такие как более удобные методы поиска или запросы для конкретных продуктов, то верните собственный класс ProductList
.
Если нет , нет необходимости заключать его в собственный класс. Вместо этого вы должны вернуть IList
или IEnumerable
, чем более общий, тем лучше. Это сохраняет идею возврата списка или коллекции продуктов, но не связывает вас с фактической реализацией коллекции (связанный список, массив и т. Д.).
Microsoft Code Analysis рекомендует унаследовать от Collection
Это сообщение в блоге объясняет, почему.
Вы можете унаследовать свой собственный класс коллекции от Collection
Для добавления дополнительных настраиваемых функций
Чтобы предоставить COMVisible строго типизированный класс коллекции.
Если вы просто хотите вернуть последовательность продуктов и никогда не будете использовать какие-либо функции из списка, я бы посоветовал вам использовать что-то вроде:
public static IEnumerable<Product> GetProductList()
Объем выделяемой памяти должен быть идентичным, но второй вариант более гибкий, так как он позволяет добавлять пользовательские методы в возвращаемый список продуктов.
В интересах инкапсуляции (или абстракция, спасибо Marc), лучше всего вернуть IList
или реализовать IList
соответственно.
Лично я бы согласился с вашим первым предложением просто потому, что это означает, что вы не создаете новый класс. Я делаю это так, поскольку это предотвращает создание множества классов специального назначения, когда было бы достаточно одного универсального класса.
public static IList