Decir que tengo la siguiente interfaz para exponer una lista paginadapatrón para exponer versión no genérica de interfaz genérica
public interface IPagedList<T>
{
IEnumerable<T> PageResults { get; }
int CurrentPageIndex { get; }
int TotalRecordCount { get; }
int TotalPageCount { get; }
int PageSize { get; }
}
Ahora queremos crear un control de aviso
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);
}
}
El control de aviso tiene sin interés en T
(el contenido real de la lista). Solo requiere el número de páginas, la página actual, etc. Por lo tanto, la única razón por la cual PagedListPager
es genérico es para que compile con el parámetro genérico IPagedList<T>
.
¿Es esto un olor a código? ¿Debería importarme que efectivamente tenga un genérico redundante?
¿Existe un patrón estándar en un caso como este para exponer una versión no genérica adicional de la interfaz, por lo que puedo eliminar el tipo genérico en el localizador?
public class PagedListPager(IPagedList list)
Editar
pensé que también añadiría la forma actual He resuelto este problema y solicitar comentarios sobre si se trata de una solución adecuada:
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
}
Ahora puedo pasar ConcretePagedList<T>
a clases/funciones no genéricas
¿Es 'PagedListPager' una declaración de clase o método? –
@Gregg uy disculpe voy a editar eso. – fearofawhackplanet
No me gusta tener las propiedades definidas en ambas interfaces ya que podría implementarlas explícitamente para hacer cosas diferentes. Por ejemplo, IPagedList.PageSize {get {return 8;}} IPageList .PageSize {get {return this.PageResults.Count();}} La única razón por la que tiene la segunda interfaz es proporcionar tipado fuerte, por lo que la respuesta de Marc parece eliminar la posibilidad de que la clase a tener diferentes resultados en las propiedades que no debería ser diferente. –
MPavlak