Я бы сказал, что при использовании дженериков редко бывает поводом для создания пользовательского типа коллекции. Но если вам нужно, я бы сказал, что ProductCollection
лучше всего соответствует соглашениям об именах платформы.
Тем не менее, рассмотрите возможность использования List<Product>
или Collection<Product>
или еще лучше IList<Product>
или ICollection<Product>
.
Редактировать: Это ответ на комментарии господина Эдмундо ниже.
В вашем случае у вас есть два варианта. Наиболее очевидный выбор - использовать наследование следующим образом:
class Ball { }
class BallCollection : List<Ball>
{
public String Color { get; set; }
public String Material { get; set; }
}
Я говорю очевидное, потому что кажется на первый взгляд лучшей идеей, но после недолгих размышлений становится ясно, что это не лучший выбор. Что если вы или Microsoft создадите новый SuperAwesomeList<T>
, и вы хотите использовать его для повышения производительности вашего BallCollection
класса? Это будет трудно, потому что вы связаны с классом List<T>
посредством наследования, и изменение базового класса потенциально может нарушить любой код, который использует BallCollection
в качестве List<T>
.
Так какое же решение лучше? Я бы порекомендовал, чтобы в этом случае вам было бы лучше отдать состав перед наследованием. Так как же будет выглядеть решение на основе композиции?
class Ball { }
class BallCollection
{
public String Color { get; set; }
public String Material { get; set; }
public IList<Ball> Balls { get; set; }
}
Обратите внимание, что я объявил свойство Balls
типа IList<T>
. Это означает, что вы можете свободно реализовывать свойство, используя любой тип по вашему желанию, если этот тип реализует IList<T>
. Это означает, что вы можете свободно использовать SuperAwesomeList<T>
в любой точке, что делает этот тип значительно более масштабируемым и гораздо менее болезненным для обслуживания.