实现Interfaces的多个函数以及彼此继承的返回

时间:2018-05-25 08:47:34

标签: c# interface asp.net-core-2.0

所以,我有2个基本接口。例如:

public interface IPageParameter
{
    int Pagenumber { get; set; }
}
public interface IPageModel
{
    int CurrentPage { get; set; }

    IPageParameter GetLinkParameter();
}

现在我想扩展它们,而不更改它们,所以我写了两个新的接口:

public interface IPageParameterExt : IPageParameter
{
    int PerPage { get; set; }
}
public interface IPageModelExt : IPageModel
{
    int CurrentPerPage { get; set; }

    new IPageParameterExt GetLinkParameter();
}

现在,如果我在一个类中实现它,我需要编写两个函数

public class DefaultPageParameterExt : IPageParameterExt
{
    public int Pagenumber { get; set; }
    public int PerPage { get; set; }
}

public class PageModel : IPageModelExt
{
    public int CurrentPage { get; set; }
    public int CurrentPerPage { get; set; }


    IPageParameterExt IPageModelExt.GetLinkParameter()
    {
        return new DefaultPageParameterExt()
        {
            Pagenumber = CurrentPage,
            PerPage = CurrentPerPage
        };
    }

    IPageParameter IPageModel.GetLinkParameter()
    {
        return ((IPageModelExt)this).GetLinkParameter();
    }
}

但这对我来说似乎不太好。我的意思是,如果它进一步扩展,这是否意味着每次必须编写另一个GetLinkParameter?或者有没有办法告诉接口这个函数可以用于其父函数?或者告诉班级你可以使用这个函数来实现这两个函数吗?

修改 好的,因为这里的问题是我想用给定的例子做的(这是我需要的最简单的时间,但我需要用类似的术语来完成其他一些任务):

我目前正在使用ASP Core 2.0.5 Razorpages并实现了多个IHtmlHelper扩展,在那里Pagemodels实现了IPageModel,以便能够创建一些简单的元素分页。 IPageParameter包含创建具有更改参数的超链接所需的内容(例如,第一页为Pagenumber = 1或下一页为Pagenumber += 1

现在我的工作是创建一个IHtmlHelper扩展,它允许它选择每页显示多少个元素,而不是使用固定的值。

EDIT2:

这里有一些扩展的简化代码,因为它已被请求。

public static IHtmlContent GetPageButtons<TModel>(this IHtmlHelper<TModel> helper, TModel Model)
        where TModel : IPageModel
{
    var urlHelper = new UrlHelper(helper.ViewContext);
    var html = new HtmlContentBuilder();
    var para = Model.GetLinkParameter();

    string prevclass = Model.CurrentPage <= 1 ? "btn btn-default disabled" : "btn btn-default";

    html.AppendHtml(@"<table style=""width:1%"">")
            .AppendHtml("<tr>")
                .AppendHtml("<td>");

    /*other buttons*/

    para.Pagenumber = Model.CurrentPage -1;

    html
                    .AppendFormat(@"<a href=""{1}"" class=""{0}"">{2}</a>", prevclass, urlHelper.Action("", para), "<")
                .AppendHtml("</td>")

    /*other buttons*/

            .AppendHtml("</tr>")
        .AppendHtml("</table>");

    return html;
}

1 个答案:

答案 0 :(得分:1)

对于仿制药有很多好处。不要为每种可能的类型编写新的扩展,只需对所有可能类型使用单一方法。那你甚至不需要任何扩展接口:

public interface IPageModel<T>
{
    int CurrentPage { get; set; }    
    T GetLinkParameter<T>();
}

public class PageModel : IPageModel<IMyInterface>
{
    public int CurrentPage { get; set; }

    IMyInterface GetLinkParameter()
    {
        return new DefaultPageParameterExt()
        {
            Pagenumber = CurrentPage,
            PerPage = CurrentPerPage
        };
    }
}