Почему возвращать интерфейс коллекции, а не конкретный тип? [дубликат]

Я заметил в чужом коде, что методы, возвращающие общие коллекции, почти всегда возвращают интерфейс (например, IEnumerable или IList ), а не конкретный реализация.

У меня два связанных вопроса. Во-первых, почему (если вообще) лучше вернуть интерфейс? Во-вторых, существует ли интерфейс коллекции, который включает метод сортировки (как List )?

16
задан abatishchev 31 August 2012 в 14:17
поделиться

4 ответа

From C # - List или IList

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

Если вы используете его только для внутренних целей, вы можете не заботиться так сильно, и используя Список может быть в порядке.

5
ответ дан 30 November 2019 в 17:51
поделиться

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

Это также выразительно: если вы возвращаете IEnumerable, когда объект используется, кодировщику ясно, что нас заботит только то, что это какая-то коллекция, а не конкретный тип

2
ответ дан 30 November 2019 в 17:51
поделиться

Я не могу говорить за всех, но обычно я делаю это только потому, что мне нравится возвращать только то, что мне нужно. Зачем возвращать полноценную коллекцию, когда все, что вам нужно, - это перечислимая коллекция, которую можно повторять.

Что касается другой части вашего вопроса, вы всегда можете использовать IList, а затем использовать LINQ для сортировки:

list.OrderBy(a=>a.Id);
1
ответ дан 30 November 2019 в 17:51
поделиться

По первому вопросу: если вы возвращаете интерфейс, вы сохраняете больше гибкости. Вы можете изменить реализацию позже, чтобы вернуть другой конкретный тип. С другой стороны, это, очевидно, дает вызывающему абоненту меньше информации, поэтому он может быть не в состоянии выполнять определенные операции. (например, если вы возвращаете List, вызывающая сторона может использовать ConvertAll и т. д., чего они не могут, если вы только объявите, что возвращаете IList.) В в некоторых ситуациях стоит указывать конкретный тип; Я обычно предпочитаю, по крайней мере, начинать с интерфейсов и переходить к указанию конкретного типа в качестве типа возвращаемого значения только в том случае, если я обнаруживаю, что часто хочу использовать дополнительные доступные методы.

Во-вторых, стандартные интерфейсы коллекций не имеют метода Sort. С другой стороны, вы можете написать метод расширения для сортировки любого IList. Лично я обычно предпочитаю методы LINQ OrderBy, OrderByDescending, ThenBy и ThenByDescending... хотя они возвращают новую последовательность, а не сортировка на месте.

22
ответ дан 30 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: