У меня есть следующая проблема: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);
}
}
Можете ли вы показать код, в котором вы вызываете метод? – stuartd
@stuartd: Пример кода см. Выше. Спасибо. – Mate