C # rzuca odziedziczony interfejs Generic
Mam kłopoty z odwróceniem głowy od obsadzenia interfejsu, który wymyśliłem. To projekt MVP dla C # Windows Forms. Mam klasę IView, którą implementuję na moich klasach formularzy. Istnieje również IPresenter, który wywodzę się z różnych konkretnych prezenterów. Każdy prezenter będzie zarządzał IView w różny sposób w zależności od roli, na przykład otwierając okno dialogowe, aby wprowadzić nowy zestaw danych za pomocą AddPresentera, w przeciwieństwie do edycji istniejących danych za pomocą EditPresentera, który wstępnie wczytałby dane do formularza. Każdy z nich dziedziczy po IPresenter. Chcę użyć kodu jako takiego:
AddPresenter<ConcreteView> pres = new AddPresenter<ConcreteView>();
Zasadniczo mam to działanie, ale ci prezenterzy i widoki, którymi zarządzają, są dołączone do wtyczek, które są ładowane po uruchomieniu, co oznacza, że potrzebuję klasy Manager, która działa jako interfejs wtyczki przyjmujący parametr „tryb”. Ten parametr trybu służy do tworzenia fabrycznej metody dodawania lub edytowania prezentera, ale ponieważ wywołanie pokazujące okno dialogowe zostanie wykonane później, muszę nawiązać połączenie za pośrednictwem interfejsu IPresenter w następujący sposób:
private IPresenter<IView> pres;
public ShowTheForm()
{
pres.ShowDialog();
}
Teraz mam problemy, jeśli chodzi o obudowanie mojej konkretnej instancji słowa AddPresenter do członka pres. Oto uproszczona wersja tego, co mam:
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;
}
To jest błąd:
Unable to cast object of type 'CPresenter`1[MvpApp1.MainForm+CView]' to type 'IPresenter`1[MvpApp1.MainForm+IView]'.
Zarówno specyfikacja typu Presenter, jak i Generic z tego, co mogę powiedzieć podklasom interfejsów ARE, więc nie mogę zrozumieć, dlaczego nie będzie rzutować.
jakieś pomysły?
Steve