如何在多个类中使用继承



我确信有人以前尝试过这样的事情,但我不确定我在搜索中找到的内容是否符合我想要做的。

在我的.Net 6 Web API中,我有一个类来获取请求传递的数据:

public abstract class QueryStringParameters {
private readonly int _maxPageSize = Constants.DefaultPageSizeMax;
private int _pageSize = Constants.DefaultPageSize;
public int? PageNumber { get; set; } = 1;
public int? PageSize {
get => _pageSize;
set => _pageSize = value > _maxPageSize ? _maxPageSize : value ?? Constants.DefaultPageSize;
}
public string OrderBy { get; set; }
public string Fields { get; set; }
}

对于每个控制器,我创建一个视图模型,该模型继承自以下内容:

public class ProgramParameters : QueryStringParameters {
public bool MapDepartment { get; set; } = true;
public bool MapAnother1 { get; set; } = true;
public bool MapAnother2 { get; set; } = true;

...
public ProgramParameters() {
// Default OrderBy
OrderBy = "Id";
}
}

当调用一个需要多个结果和单个结果的端点时,这种方法可以很好地工作。但是,我想拆分用于分页的QueryStringParameters属性,如下所示:

public abstract class QueryStringParameters {
public string Fields { get; set; }
}
public abstract class QueryStringParametersPaginated : QueryStringParameters {
private readonly int _maxPageSize = Constants.DefaultPageSizeMax;
private int _pageSize = Constants.DefaultPageSize;
public int? PageNumber { get; set; } = 1;
public int? PageSize {
get => _pageSize;
set => _pageSize = value > _maxPageSize ? _maxPageSize : value ?? Constants.DefaultPageSize;
}
public string OrderBy { get; set; }
}

问题是,然后我的视图模态看起来像这样:

public class ProgramParameters : QueryStringParameters {
public bool MapDepartment { get; set; } = true;
public bool MapAnother1 { get; set; } = true;
public bool MapAnother2 { get; set; } = true;

...
public ProgramParameters() {
}
}
public class ProgramParametersPaginated : QueryStringParametersPaginated {
public bool MapDepartment { get; set; } = true; // repeated
public bool MapAnother1 { get; set; } = true; // repeated
public bool MapAnother2 { get; set; } = true; // repeated

...
public ProgramParameters() {
// Default OrderBy
OrderBy = "Id";
}
}

我如何重写它,使ProgramParametersProgramParametersPaginated不必在两者中定义相同的属性(MapDepartmentMapAnother1MapAnother2(?

我尝试过这样的事情,但这是不允许的,我不确定如何继续。

public class ProgramParametersPaginated : ProgramParameters, QueryStringParametersPaginated {
public ProgramParametersPaginated() {
// Default OrderBy
OrderBy = "Id";
}
}

如果我理解正确,您需要提取接口,而不是像以前那样使用类,这样您就可以应用多个实现。

首先为您定义过滤属性的接口和常量:

public enum Constants
{
DefaultPageSizeMax = 500,
DefaultPageSize = 100
}
public interface IQueryStringParameters
{
string Fields { get; set; }
}
public interface IQueryStringParametersPaginated : IQueryStringParameters
{
string OrderBy { get; set; }
int PageSize { get; set; }
int MaxPageSize { get; set; }
int? PageNumber { get; set; }
}

然后创建一个从定义的两个接口继承的抽象类,这样就可以像使用setter和getter那样编写一些行为:

public abstract class BaseProgramParameters : IQueryStringParameters, IQueryStringParametersPaginated
{
public string Fields { get; set; }
public string OrderBy { get; set; }
private int _pageSize = (int)Constants.DefaultPageSize;
private int _maxPageSize = (int)Constants.DefaultPageSizeMax;
public int PageSize
{
get => _pageSize;
set => _pageSize = value > _maxPageSize ? _maxPageSize : value;
}
public int MaxPageSize { get; set; }
public int? PageNumber { get; set; }
public bool MapDepartment { get; set; } = true;
public bool MapAnother1 { get; set; } = true;
public bool MapAnother2 { get; set; } = true;
public BaseProgramParameters()
{
}
public BaseProgramParameters(string orderBy)
{
this.OrderBy = orderBy;
}
}

由于您可能想在MapDeparment、MapAnother等上定义不同的值,因此可以在子类上使用构造函数:

public class ProgramParametersPaginated : BaseProgramParameters
{
public ProgramParametersPaginated() : base("Id")
{
}
}
public class ProgramParameters : BaseProgramParameters
{
public ProgramParameters()
{
this.MapAnother1 = false;
}
}

如果你还有任何疑问,请告诉我。

相关内容

  • 没有找到相关文章

最新更新