我在理解如何转换我设计的接口方面遇到了一些问题。这是一个针对C# Windows Forms的MVP设计。我有一个IView类,在我的表单类上实现它。还有一个IPresenter,我将其派生为各种特定的Presenter。每个Presenter将根据不同的角色以不同的方式管理IView,例如使用AddPresenter打开对话框以输入新数据,而使用EditPresenter编辑现有数据,并将数据预加载到表单上。它们都继承自IPresenter。我想这样使用代码:
AddPresenter<ConcreteView> pres = new AddPresenter<ConcreteView>();
我基本上已经把这个做好了,但是这些Presenter和它们所管理的View被捆绑成插件,这些插件是在运行时后加载的,这意味着我需要一个Manager类作为插件接口来接受一个"mode"参数。该模式参数用于工厂方法创建Add或Edit Presenter,但是因为对话框的调用稍后才进行,所以我需要通过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类型规范都是接口的子类,所以我不明白为什么它无法进行强制转换。
有什么想法吗?
史蒂夫
V
仅用于输出位置的情况下,此方法才能起作用。例如,在类型为V
的方法参数或属性设置器中将无法使用该方法。 - phoog