C#:通用接口转换错误
实际上,我正在尝试为我的系统创建一个基本的MVP框架。我有C#:通用接口转换错误,c#,generics,C#,Generics,实际上,我正在尝试为我的系统创建一个基本的MVP框架。我有IPresenter,IView,PresenterBase和ViewBase 代码如下: public interface IPresenter { IAppController GetAppController(); } public interface IView { void AttachPresenter<T>(T presenter) where T : IPresenter; } public
IPresenter
,IView
,PresenterBase
和ViewBase
代码如下:
public interface IPresenter
{
IAppController GetAppController();
}
public interface IView
{
void AttachPresenter<T>(T presenter) where T : IPresenter;
}
public abstract class BasePresenter<TView> : IPresenter where TView : class, IView
{
protected readonly TView View;
protected readonly IAppController AppController;
protected BasePresenter(TView view, IAppController appController)
{
View = view;
AppController = appController;
View.AttachPresenter(this);
}
public IAppController GetAppController()
{
return AppController;
}
}
public class BaseView<TPresenter> : Form, IView where TPresenter : class, IPresenter
{
protected TPresenter Presenter;
public void AttachPresenter<T>(T presenter) where T : IPresenter
{
Presenter = presenter; // <-- ERROR HERE
}
}
公共接口IPresenter
{
IAppController GetAppController();
}
公共接口IView
{
无效附件提交人(T提交人),其中T:I提交人;
}
公共抽象类BasePresenter:IPresenter,其中TView:class,IView
{
受保护的只读TView视图;
受保护的只读IAppController-AppController;
受保护的BasePresenter(TView视图、IAppController和appController)
{
视图=视图;
AppController=AppController;
View.AttachPresenter(此);
}
公共IAppController GetAppController()
{
返回控制器;
}
}
公共类BaseView:Form,IView其中TPresenter:class,IPresenter
{
受保护的TPresenter演示器;
公共无效附件演示者(T演示者),其中T:I演示者
{
Presenter=Presenter;//因为您需要相同类型的Presenter,所以您只需使用:
public void AttachPresenter(TPresenter presenter)
{
Presenter = presenter;
}
由于您需要相同类型的演示者,因此可以使用:
public void AttachPresenter(TPresenter presenter)
{
Presenter = presenter;
}
虽然T
和TPresenter
正在实现i当前者
,但编译器并不认为存在相同的对象,例如:您有一个IAnimal
,并且Cat
和Dog
实现IAnimal
,但您不能像这样将Cat
分配给Dog
我想这就是原因
那么,为什么不把函数改为
public void AttachPresenter(TPresenter presenter)
{
Presenter = presenter;
}
虽然T
和TPresenter
正在实现i当前者
,但编译器并不认为存在相同的对象,例如:您有一个IAnimal
,并且Cat
和Dog
实现IAnimal
,但您不能像这样将Cat
分配给Dog
我想这就是原因
那么,为什么不把函数改为
public void AttachPresenter(TPresenter presenter)
{
Presenter = presenter;
}
尝试where T:class,IPresenter
trywhere T:class,IPresenter
如何在界面中实现void AttachPresenter(TPresenter-presenter)
?void AttachPresenter(IPresenter-presenter)但是是的,您也需要将您的私有字段更改为IPresenter。我如何实现void AttachPresenter(TPresenter presenter)
在界面中?作废AttachPresenter(IPresenter presenter),但是是的,您也需要将您的私有字段更改为IPresenter。如何添加作废AttachPresenter(TPresenter presenter)
在界面中?因为我想在BaseView中实现IView。将IView更改为公共界面IView,其中T:IPresenter
并将此界面中的函数更改为“void AttachPresenter(TPresenter presenter)”;如何添加void AttachPresenter(TPresenter presenter)
在界面中?因为我想在BaseView中实现IView。请将IView更改为公共界面IView,其中T:IPresenter
并将此界面中的函数更改为“void AttachPresenter(TPresenter presenter);”