У меня возникают проблемы с созданием интерфейса, который я придумал. Это MVP-дизайн для С# Windows Forms. У меня есть класс IView, который я реализую на своих классах форм. Там также IPresenter, который я получаю в различных конкретных докладчиков. Каждый Presenter будет управлять IView по-разному в зависимости от роли, например, открывая диалог для ввода нового набора данных с помощью AddPresenter, а не для редактирования существующих данных с помощью EditPresenter, который предварительно загружал данные в форму. Каждый из них наследуется от IPresenter. Я хочу использовать код как таковой:
AddPresenter<ConcreteView> pres = new AddPresenter<ConcreteView>();
В основном я работаю, но эти ведущие и те взгляды, которыми они управляют, объединены в плагины, которые загружаются после выполнения, что означает, что мне нужен класс Manager, который действует как интерфейс плагина, принимает параметр "mode". Этот параметр режима используется для метода factory для создания либо добавления, либо редактирования презентатора, а потому, что вызов для отображения диалога выполняется позже, тогда мне нужно сделать вызов через интерфейс IPresenter следующим образом:
private IPresenter<IView> pres;
public ShowTheForm()
{
pres.ShowDialog();
}
Теперь у меня возникают проблемы, когда дело доходит до того, что мой конкретный экземпляр AddPresenter скажет члену "pres". Здесь сокращена упрощенная версия того, что у меня есть:
interface IView
{
void ViewBlah();
}
interface IPresenter<V> where V : IView
{
void PresBlah();
}
class CView : IView
{
public void ViewBlah()
{
}
}
class CPresenter<T> : IPresenter<T> where T : IView
{
public void PresBlah()
{
}
}
private void button3_Click(object sender, EventArgs e)
{
CPresenter<CView> cpres = new CPresenter<CView>();
IPresenter<IView> ipres = (IPresenter<IView>)cpres;
}
Это ошибка:
Unable to cast object of type 'CPresenter`1[MvpApp1.MainForm+CView]' to type 'IPresenter`1[MvpApp1.MainForm+IView]'.
Как спецификатор Presenter, так и тип Generic из того, что я могу сказать подклассам ARE интерфейсов, поэтому я не могу понять, почему он не будет выполняться.
Любые мысли?
Стив