gpt4 book ai didi

C# 转换继承的通用接口(interface)

转载 作者:可可西里 更新时间:2023-11-01 03:06:02 24 4
gpt4 key购买 nike

我在转换我想出的界面时遇到了一些麻烦。它是 C# Windows 窗体的 MVP 设计。我有一个 IView 类,我在我的表单类上实现了它。还有一个 IPresenter,我派生到各种特定的 Presenter 中。每个 Presenter 将根据角色以不同方式管理 IView,例如打开对话框以使用 AddPresenter 输入一组新数据,而不是使用 EditPresenter 编辑现有数据,后者会将数据预加载到表单中。其中每一个都继承自 IPresenter。我想这样使用代码:

AddPresenter<ConcreteView> pres = new AddPresenter<ConcreteView>();

我基本上可以正常工作,但是这些演示者和它们管理的 View 被捆绑到插件中,这些插件在运行后加载,这意味着我需要一个管理器类,它作为插件接口(interface)使用“模式”参数。此模式参数用于创建添加或编辑演示者的工厂方法,但由于显示对话框的调用是稍后进行的,因此我需要通过 IPresenter 接口(interface)进行调用,如下所示:

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 类型规范都是接口(interface)的子类,所以我不明白为什么它不会转换。

有什么想法吗?

史蒂夫

最佳答案

问题是泛型类型参数。如果您使接口(interface)参数协变,则转换将起作用。

这是通过添加 out 关键字来实现的,如下所示:

interface IPresenter<out V> where V : IView
{
void PresBlah();

}

您可以通过以下 MSDN 文章了解更多有关其工作原理的信息:Covariance and Contravariance in Generics .本节Generic Interfaces with Covariant Type Parameters特别适用于您的问题。

更新:确保你检查了@phoog 和我之间的评论。如果您的实际代码接受 V 作为输入,您将无法使其协变。引用文章和@phoog 的回答更详细地解释了这种情况。

关于C# 转换继承的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12365993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com