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

时间:2011-11-18 11:22:58

标签: c# inheritance architecture class-design

对于对象序列化我为每个对象创建了一个DataTransferObject-Pendant。每个原始对象都有一个ToDTO()方法,该方法返回具有要保存属性的相应DTO-Object。我的大多数原始对象都是从另一个继承的,所以我希望每个继承级别都能够关注自己的属性。一个简单的例子:

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对象。任何人都可以建议,如何最好地实现此功能?

提前致谢,
弗兰克

2 个答案:

答案 0 :(得分:5)

如果您真的想在业务对象中使用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;
    }
}

答案 1 :(得分:3)

我会使用Template Method

class baseCls
{
  private string _name;

  public DTO_base ToDTO()
  {
    DTO_base result = createDTO();
    result.Name = _name;
    setAdditionalData(result);
    return result;
  }

  protected abstract DTO_base createDTO();
  protected abstract void setAdditionalData(DTO_base dto);
}

class inherited : baseCls
{
  private string _description;

  protected override DTO_base createDTO() {
    return new DTO_inerited();
  }
  protected override void setAdditionalData(DTO_base dto) {
     inherited i = (DTO_inherited)dto;
     i.Description = _Description;
  }
}