2015-09-22 2 views
1

У меня есть следующая проблема:UserControl наследование с общим интерфейсом DTO

Я хотел бы иметь следующие объекты:

  • Несколько DTOs, е. г. для сотрудников, клиентов и т. д.
  • Несколько пользовательских элементов управления, один (или более) для каждого DTO, который отображает содержимое DTO и предоставляет модификации, которые пользователь мог бы вернуть обратно в DTO.
  • Базовый класс этих пользовательских элементов управления предоставляет некоторые функции по умолчанию.
  • Стандартная кнопочная панель с CRUD-операциями, которая должна работать со всеми моими пользовательскими элементами управления.

То, что я сделал до сих пор:

  • У меня есть абстрактный базовый класс для DTOS и несколько специальных классов DTO.
  • У меня есть стандартные функции в обработчиках событий по умолчанию. В качестве примера: кнопка «Сохранить» запрашивает пользовательский контроль для текущих данных (через DTO), передает данные в некоторый класс проверки, и если все проверки прошли, данные хранятся в базе данных. Для извлечения данных есть ссылка на объект клиента, установленный через конструктор.
  • У меня есть базовый класс для пользовательских элементов управления. Это не абстрактно, потому что я хотел бы иметь поддержку дизайнера. Таким образом, этот класс обеспечивает доступ к своим элементам управления с помощью виртуальных методов на основе абстрактного базового класса для DTO.
  • У меня есть общий интерфейс, основанный на конкретных типах DTO, которые определяют доступ к данным с одинаковыми именами методов.
  • Теперь я создаю новый пользовательский элемент управления, наследующий от моего базового класса управления пользователями и реализующий общий интерфейс для подходящего класса DTO. Поэтому BaseDTO GetData() переопределяется новым методом SpecialDTO GetData().

А вот моя проблема:

  • В моей обработчик событий, контроль Клиент моего желаемого типа, е. г. 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); 
    } 
} 
+0

Можете ли вы показать код, в котором вы вызываете метод? – stuartd

+0

@stuartd: Пример кода см. Выше. Спасибо. – Mate

ответ

0

Вы не можете изменить подпись функции при переопределении.
Это означает, что вы не можете получить это преобразование public BaseDTO GetData() -> public CustomerDTO GetData().
Так что вам нужно изменить CustomerClient к

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

или искать другой дизайн класса.

Смежные вопросы