Представьте себе класс, допустим, для разбивки на страницы, который можно использовать с IList<T> или IQueryable<T>.
Этот класс будет иметь свойство int TotalItems, которое (не удивительно) получит/задает счетчик запрашиваемого или перечислимого параметра.
Если я использую IEnumerable<T> как параметр,
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
метод Count() будет (, если я не ошибаюсь, что точка) Enumerable.Count(). Таким образом, даже если запрос является IQueryable<T> (который наследуется от IEnumerable<T>), он будет перечисляться (что явно не желательно с "запросом db" ).
Итак, есть способ использовать метод Queryable.Count(), когда мой IEnumerable<T> на самом деле является IQueryable<T>, или мне нужно изменить свой дизайн, имея, например, в этом случае 2 ctor
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
public Pagination(IQueryable<T> query)
{
TotalItems = query.Count();
}
ИЗМЕНИТЬ
Я понимаю, что IQueryable<T>, наследующий от IEnumerable<T>, не имеет ничего общего с тем, что IEnumerable<T> и IQueryable<T> имеют методы расширения с одинаковым именем, и что это хорошо, чтобы иметь одинаковые имена для метода расширения, которые выглядят они делают то же самое ", но я думаю, что это все еще иногда путается...
Общий вопрос для любопытства
Являются ли они другими примерами в рамках с той же "архитектурой": наследование + общие имена для методов расширения?