【发布时间】:2011-10-01 04:17:47
【问题描述】:
假设我有以下用于公开分页列表的界面
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<T> 参数进行编译。
这是代码异味吗?我应该关心我实际上有一个多余的泛型吗?
在这种情况下,是否有标准模式可以公开额外的非泛型接口版本,以便我可以删除寻呼机上的泛型类型?
public class PagedListPager(IPagedList list)
编辑
我想我也会添加我解决此问题的当前方式,并邀请 cmets 了解它是否是合适的解决方案:
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<T> 传递给非泛型类/函数
【问题讨论】:
-
PagedListPager<T>是类还是方法声明? -
@Gregg 抱歉,我会编辑它。
-
我不喜欢在两个接口中定义属性,因为你可以显式地实现它们来做不同的事情。例如, IPagedList.PageSize {get{return 8;}} IPageList
.PageSize{get{return this.PageResults.Count();}} 您拥有第二个界面的唯一原因是提供强类型,所以 Marc 的回答似乎消除了类对不应不同的属性产生不同结果的能力。
标签: c# design-patterns generics interface open-generics