UserControl继承与通用DTO接口

时间:2015-09-22 09:32:32

标签: c# generics dto

我有以下问题:

我想拥有以下对象:

  • 几个DTO,例如G。适用于员工,客户等。
  • 多个用户控件,每个DTO一个(或多个)显示DTO内容,并提供用户可能返回DTO的修改。
  • 这些用户控件的基类提供了一些默认功能。
  • 带有CRUD操作的标准按钮面板,可以与我的所有用户控件一起使用。

到目前为止我所做的是:

  • 我有一个DTO的抽象基类和几个特殊的DTO类。
  • 我的默认按钮事件处理程序中有标准功能。例如:保存按钮询问用户对当前数据的控制(通过DTO),将数据传递给某个检查类,如果所有检查都通过,则数据存储在数据库中。要检索数据,可以引用通过构造函数设置的客户端对象。
  • 我的用户控件有一个基类。这不是抽象的,因为我想得到设计师的支持。因此,该类基于DTO的抽象基类,通过虚方法提供对其控件的访问。
  • 我有一个基于特定DTO类型的通用接口,它使用相同的方法名称定义数据访问。
  • 现在我创建一个新的用户控件,继承自我的用户控件基类并实现适合的DTO类的通用接口。因此,使用新的SpecialDTO GetData()方法覆盖 BaseDTO GetData()

这是我的问题:

  • 在我的事件处理程序中,客户端控件属于我想要的类型,例如: G。 CustomerClientControl。但是调用的方法不是新的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);
    }
}

1 个答案:

答案 0 :(得分:0)

覆盖时无法更改功能签名 这意味着您无法进行此转换public BaseDTO GetData() -> public CustomerDTO GetData() 因此,您需要将CustomerClient更改为

public CustomerClient : BaseClient
{
    public override BaseDTO GetData()
    {
        // CustomerDTO : BaseDTO
        return new CustomerDTO(this.CustomerNameTextbox);
    }
}

或寻找另一个班级设计。