如何解决使用带有泛型的接口类型作为容器类型将实现的实例映射到字典
界面:
let run = await element[0].$('div>div>div>span')
let run = await element[0].$('div>span')
实现:
interface IFoo<T,U>
{
U Method1(T item);
T Method2(U id);
}
有了这个出发点,假设我得到了每个可用实现类型的实例,我想将每个实例映射到字典中,分别访问相应的 public class Type1 { }
public class Implementation1 : IFoo<Type1,int> {
public int Method1(Type1 item)
{
throw new NotImplementedException();
}
public Type1 Method2(int id)
{
throw new NotImplementedException();
}
//....
public int Method3()
{
int myReturnedInt = 0;
//....
return myReturnedInt;
}
public void Method4()
{
}
}
public class Type2 { }
public class Implementation2 : IFoo<Type2,int> {
public int Method1(Type2 item)
{
throw new NotImplementedException();
}
public Type2 Method2(int id)
{
throw new NotImplementedException();
}
public int Method3()
{
int myReturnedInt = 0;
//....
return myReturnedInt;
}
public void Method4()
{
}
}
和 Method3
,所以我试过:
对泛型的类型和抽象进行分组:
Method4
填写字典:
public interface IContainerInterface : IFoo<Type1,int>,IFoo<Type2,int>
{
int Method3();
void Method4();
}
但是不起作用。尽管 public enum EnumType
{
type1,type2
}
Implementation1 type1Instance;
Implementation2 type2Instance;
private Dictionary<EnumType,IContainerInterface> _container;
void Main(string[] args)
{
_container = new Dictionary<EnumType,IContainerInterface>{
{EnumType.type1,type1Instance as IContainerInterface},{EnumType.type2,type2Instance as IContainerInterface}
};
}
可用,但字典中的值为空。
一个没有泛型的工作示例将是 this 问题的答案,即在不涉及泛型的情况下实现从接口到实现的绑定,但如何使用接口中的泛型实现这一点?
我的目标是能够像这样分别访问类型的方法:
Implementation1Instance
编辑:
更正通读中的所有错别字并找到完整的编译片段(不要执行,但能够理解并遵循我试图解释的问题):
//for type1
int myInt = _container[EnumType.type1].Method3();
_container[EnumType.type1].Method4();
//for type2
int myInt = _container[EnumType.type2].Method3();
_container[EnumType.type2].Method4();
解决方法
如果您在这里尝试做的是定义一个接口来以多态方式保存这些类型,并且您能够定义一个提供所有必需功能的完全工作的非通用接口,那么您以错误的方式重新处理这个问题。
而不是写这个完全错误、容易出错和短视的怪物(当你需要更多类型时会发生什么,不管它们是什么?你为哪个接口实现同名函数?等等):
interface IContainerInterface: IFoo<Type1,int>,IFoo<Type2,int>
您应该做的是在继承树的最根部定义一个 IContainerInterface
,然后从中派生出 IFoo<>
。您的字典初始化和使用保持不变,您不再需要每次需要新类型时更改界面。
接口的所有实现不贴
当然,前提是您可以从代码中提取非通用接口。这是任何人的猜测,因为您当然根本不提供相关和/或正确的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。