Объект, созданный в унаследованном классе, используется в базовом классе - PullRequest
2 голосов
/ 18 ноября 2011

для сериализации объектов Я создал DataTransferObject-Pendant для каждого из моих объектов.Каждый исходный объект получает метод ToDTO (), который возвращает соответствующий объект DTO с сохраняемыми свойствами.Большинство моих исходных объектов наследуются от других, поэтому я бы хотел, чтобы каждый уровень наследования заботился о своих собственных свойствах.Простой пример:

class base
{
  private string _name;

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

Унаследованный класс должен переопределить метод ToDTO (), вызвав метод parent и добавив свои собственные свойства для сохранения, например:

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 ]

5 голосов
/ 18 ноября 2011

Если вы действительно хотите иметь логику создания 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;
    }
}
3 голосов
/ 18 ноября 2011

Я бы использовал Шаблонный метод :

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;
  }
}
...