具有通用 DTO 接口的 UserControl 继承
UserControl inheritance with generic DTO interface
我遇到以下问题:
我想要以下对象:
- 几个 DTO,e。 G。对于员工、客户等
- 几个用户控件,每个 DTO 一个(或多个)显示 DTO 内容并提供用户可能对 DTO 所做的修改。
- 这些用户控件的基础 class 提供了一些默认功能。
- 带有 CRUD 操作的标准按钮面板应该适用于我的所有用户控件。
到目前为止我所做的是:
- 我有一个 DTO 的抽象基础 class 和几个特殊的 DTO classes。
- 我的默认按钮事件处理程序中有标准功能。例如:保存按钮向用户控件询问当前数据(通过 DTO),将数据传递给某些检查 class,如果所有检查都通过,则数据存储在数据库中。要检索数据,需要通过构造函数设置对客户端对象的引用。
- 我的用户控件有一个基础 class。这不是抽象的,因为我希望得到设计师的支持。因此,此 class 基于 DTO 的抽象基础 class 通过虚拟方法提供访问 to/from 其控件。
- 我有一个基于特定 DTO 类型的通用接口,它定义了具有相同方法名称的数据访问。
- 现在我创建了一个新的用户控件,它继承了我的用户控件基础 class 并为合适的 DTO class 实现了通用接口。因此,BaseDTO GetData() 被 new SpecialDTO GetData() 方法覆盖。
这是我的问题:
- 在我的事件处理程序中,客户端控件是我想要的类型,例如。 G。客户客户控制。但是调用的方法不是 new CustomerDTO CustomerClientControl.GetData() 而是基础默认实现 BaseDTO BaseClientControl.GetData().
我怎样才能摆脱这个?感谢您提供任何帮助或建议,使整个结构更漂亮。
编辑:这是一些代码。
// in my "standard functionality"
BaseClient Client { get; } // or IClientDataAccess<BaseDTO>
void ButtonSave()
{
var data = this.Client.GetData(); // in runtime, this.Client is CustomerClient
// the following works, don't worry. :-)
if (this.CheckLogic.CheckData(data))
{
this.DataAccess.SaveData(data);
}
}
public interface IClientDataAccess<T> where T : BaseDTO
{ T GetData(); }
public BaseClient : UserControl, IClientDataAccess<BaseDTO>
{
public virtual BaseDTO GetData()
{
return new BaseDTO(); // some stupid default
}
}
public CustomerClient : BaseClient, IClientDataAccess<CustomerDTO>
{
public new CustomerDTO GetData()
{
// CustomerDTO : BaseDTO
return new CustomerDTO(this.CustomerNameTextbox);
}
}
覆盖时不能更改函数签名。
这意味着您不能进行此转换 public BaseDTO GetData() -> public CustomerDTO GetData()
.
所以您需要将 CustomerClient 更改为
public CustomerClient : BaseClient
{
public override BaseDTO GetData()
{
// CustomerDTO : BaseDTO
return new CustomerDTO(this.CustomerNameTextbox);
}
}
或寻找另一个 class 设计。
我遇到以下问题:
我想要以下对象:
- 几个 DTO,e。 G。对于员工、客户等
- 几个用户控件,每个 DTO 一个(或多个)显示 DTO 内容并提供用户可能对 DTO 所做的修改。
- 这些用户控件的基础 class 提供了一些默认功能。
- 带有 CRUD 操作的标准按钮面板应该适用于我的所有用户控件。
到目前为止我所做的是:
- 我有一个 DTO 的抽象基础 class 和几个特殊的 DTO classes。
- 我的默认按钮事件处理程序中有标准功能。例如:保存按钮向用户控件询问当前数据(通过 DTO),将数据传递给某些检查 class,如果所有检查都通过,则数据存储在数据库中。要检索数据,需要通过构造函数设置对客户端对象的引用。
- 我的用户控件有一个基础 class。这不是抽象的,因为我希望得到设计师的支持。因此,此 class 基于 DTO 的抽象基础 class 通过虚拟方法提供访问 to/from 其控件。
- 我有一个基于特定 DTO 类型的通用接口,它定义了具有相同方法名称的数据访问。
- 现在我创建了一个新的用户控件,它继承了我的用户控件基础 class 并为合适的 DTO class 实现了通用接口。因此,BaseDTO GetData() 被 new SpecialDTO GetData() 方法覆盖。
这是我的问题:
- 在我的事件处理程序中,客户端控件是我想要的类型,例如。 G。客户客户控制。但是调用的方法不是 new CustomerDTO CustomerClientControl.GetData() 而是基础默认实现 BaseDTO BaseClientControl.GetData().
我怎样才能摆脱这个?感谢您提供任何帮助或建议,使整个结构更漂亮。
编辑:这是一些代码。
// in my "standard functionality"
BaseClient Client { get; } // or IClientDataAccess<BaseDTO>
void ButtonSave()
{
var data = this.Client.GetData(); // in runtime, this.Client is CustomerClient
// the following works, don't worry. :-)
if (this.CheckLogic.CheckData(data))
{
this.DataAccess.SaveData(data);
}
}
public interface IClientDataAccess<T> where T : BaseDTO
{ T GetData(); }
public BaseClient : UserControl, IClientDataAccess<BaseDTO>
{
public virtual BaseDTO GetData()
{
return new BaseDTO(); // some stupid default
}
}
public CustomerClient : BaseClient, IClientDataAccess<CustomerDTO>
{
public new CustomerDTO GetData()
{
// CustomerDTO : BaseDTO
return new CustomerDTO(this.CustomerNameTextbox);
}
}
覆盖时不能更改函数签名。
这意味着您不能进行此转换 public BaseDTO GetData() -> public CustomerDTO GetData()
.
所以您需要将 CustomerClient 更改为
public CustomerClient : BaseClient
{
public override BaseDTO GetData()
{
// CustomerDTO : BaseDTO
return new CustomerDTO(this.CustomerNameTextbox);
}
}
或寻找另一个 class 设计。