Итак, у меня есть 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?Или есть способ сообщить интерфейсу, что эту функцию можно использовать для функции его Parent?Или скажите классу, что вы также можете использовать эту функцию для реализации обеих функций?
РЕДАКТИРОВАТЬ: Хорошо, потому что вопрос в том, что я хочу сделать с данным примером (это самое простое время, когда мне это нужно, но мне нужно это в схожих терминах для нескольких других задач):
В настоящее время я работаю с 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;
}