C# 在基类中使用的继承类中创建的对象

C# 在基类中使用的继承类中创建的对象,c#,inheritance,architecture,class-design,C#,Inheritance,Architecture,Class Design,对于对象序列化,我为每个对象创建了一个DataTransferObject挂件。每个原始对象都会获得一个ToDTO()-方法,该方法返回具有要保存的属性的适当DTO对象。我的大多数原始对象都是从其他对象继承的,因此我希望每个继承级别都考虑它们自己的属性。一个简单的例子: class base { private string _name; public DTO_base ToDTO() { DTO_base result = new DTO_base(); resu

对于对象序列化,我为每个对象创建了一个DataTransferObject挂件。每个原始对象都会获得一个ToDTO()-方法,该方法返回具有要保存的属性的适当DTO对象。我的大多数原始对象都是从其他对象继承的,因此我希望每个继承级别都考虑它们自己的属性。一个简单的例子:

class base
{
  private string _name;

  public DTO_base ToDTO()
  {
    DTO_base result = new DTO_base();
    result.Name = _name;
    return result;
  }
}
继承的类应该重写ToDTO()方法,调用parents方法并添加自己要保存的属性,如:

class inherited : base
{
  private string _description;

  public new DTO_inherited ToDTO()
  {
    DTO_inherited result = base.ToDTO();
    result.Description = _description;
    return result;
  }
}
显然,这是行不通的,因为base.ToDTO()返回一个DTO_base对象。有人能建议如何最好地实现此功能吗

提前感谢,
弗兰克

我会使用:


如果您真的想在业务对象中使用DTO创建逻辑,我会选择一种通用方法

class Base<TDTO> where TDTO : BaseDTO, new()
{
    private string _name;

    public TDTO ToDTO()
    {
        TDTO dto = new TDTO();
        SetupDTO(dto);
        return dto;
    }

    protected virtual void SetupDTO(TDTO dto)
    {
        dto.Name = _name;
    }
}


class Inherited : Base<InheritedDTO>
{
    private string _description;

    protected override void SetupDTO(TDTO dto)
    {
        base.SetupDTO(dto);

        dto.Description = _description;
    }
}
类基址,其中TDTO:BaseDTO,new()
{
私有字符串\u名称;
公共TDTO ToDTO()
{
TDTO dto=新的TDTO();
设置dto(dto);
返回dto;
}
受保护的虚拟空设置dto(TDTO dto)
{
dto.Name=\u Name;
}
}
继承的类:基
{
私有字符串描述;
受保护覆盖无效设置dto(TDTO dto)
{
基本设置dto(dto);
dto.Description=\u Description;
}
}

base是一个关键词,不要用这样的词来命名是的,你是对的。我只是在示例中命名它们,而不是在实际代码中。但无论如何,我应该找到一个非关键字名称+1,因为new()的用法很酷:-)不幸的是,我不得不在工作中使用Java。我没有在业务逻辑中设置创建方法,但我认为这是一个好主意,业务逻辑知道如何创建自己的DTO表示。我已经考虑过泛型,但它们似乎不适合这种情况,基本上是因为泛型意味着可以使用任何TDTO从基类继承。无论如何,使用受保护的助手方法填充的想法听起来不错。我想我会有更多的想法。谢谢阿基诺,如果答案对你有帮助,你应该接受它。否则,请自己添加答案并接受。谢谢谢谢你的提示!我想我将使用一个混合方法——一个返回DTO的公共方法和一个受保护的方法来填充数据。我将使用“new”来代替“override”,这样我就可以更改返回类型。小心使用new,因为在基类型上使用该操作时它已经重写了。嗯,这一点很好。最后,我决定使用template方法,使用返回基对象的ToDTO()方法。感谢您的帮助和评论:)
class Base<TDTO> where TDTO : BaseDTO, new()
{
    private string _name;

    public TDTO ToDTO()
    {
        TDTO dto = new TDTO();
        SetupDTO(dto);
        return dto;
    }

    protected virtual void SetupDTO(TDTO dto)
    {
        dto.Name = _name;
    }
}


class Inherited : Base<InheritedDTO>
{
    private string _description;

    protected override void SetupDTO(TDTO dto)
    {
        base.SetupDTO(dto);

        dto.Description = _description;
    }
}