Шаблон для раскрытия неуниверсальной версии универсального интерфейса

Скажем, у меня есть следующий интерфейс для отображения страничного списка

public interface IPagedList<T>
{
    IEnumerable<T> PageResults { get; }
    int CurrentPageIndex { get; }
    int TotalRecordCount { get; }
    int TotalPageCount { get; }        
    int PageSize { get; }
}   

Теперь я хочу создать элемент управления разбиением по страницам

public class PagedListPager<T>
{
    public PagedListPager<T>(IPagedList<T> list)
    {
        _list = list;
    }

    public void RenderPager()
    {
        for (int i = 1; i < list.TotalPageCount; i++)
            RenderLink(i);
    }
}

Элемент управления разбиением по страницам не интересует T (фактический содержимое списка). Требуется только количество страниц, текущая страница и т. Д. Таким образом, единственная причина, по которой PagedListPager является универсальным, заключается в том, что он компилируется с общим параметром IPagedList .

Is это запах кода? Должен ли я заботиться о том, чтобы у меня действительно был избыточный универсальный?

Есть ли в таком случае стандартный шаблон для раскрытия дополнительной неуниверсальной версии интерфейса, чтобы я мог удалить универсальный тип на пейджере?

public class PagedListPager(IPagedList list)

Изменить

Я подумал, что также добавлю текущий способ решения этой проблемы и предложу комментарии о том, подходит ли это решение:

public interface IPagedList // non-generic version
{
    IEnumerable<object> PageResults { get; }
    int CurrentPageIndex { get; }
    int TotalRecordCount { get; }
    int TotalPageCount { get; }        
    int PageSize { get; }
}


public class ConcretePagedList<T> : IPagedList<T>, IPagedList
{
    #region IPagedList<T> Members

    public IEnumerable<T> PageResults { get; set; }
    public int CurrentPageIndex { get; set; }
    public int TotalRecordCount { get; set; }
    public int PageSize { get; set; }

    #endregion

    #region IPagedList Members

    IEnumerable<object> IPagedList.PageResults
    {
        get { return PageResults.Cast<object>(); }
    }

    #endregion
}

Теперь я могу передать ConcretePagedList не- общие классы / функции

26
задан fearofawhackplanet 8 July 2011 в 10:40
поделиться