我有以下界面
id_epis_triage all_descriptions
2134 85
2137 98
ClassA是一个通用类,但是T应该实现IInterface
public interface IInterface
{
int GetId();
}
ClassB实现IInterface
public class ClassA<T> where T : IInterface {
}
ClassC是我的问题所在,即将项目添加到列表中。
public class ClassB : IInterface {
public int GetId() {
return 1;
}
}
上面的代码给出了以下有意义的错误
public class ClassC {
List<ClassA<IInterface>> list = new List<ClassA<IInterface>>();
public void Add<T>(ClassA<T> item) where T : IInterface {
list.Add(item);
}
}
问题的核心是在Add()方法中,我的目标是能够添加任何类型的ClassA。我不确定如何设计它以实现以下
cannot convert from 'Program.ClassA<T>' to'Program.ClassA<Program.IInterface>'
有什么想法吗?
答案 0 :(得分:3)
使用协变泛型类型参数怎么样?
public interface IInterface
{
int GetId();
}
// Contra-variant and covariant generic type argument can be used only in interfaces and delegates
public interface IClassA<out T> where T : IInterface
{
}
public class ClassA<T> : IClassA<IInterface> where T : IInterface { }
public class ClassB : IInterface
{
public int GetId()
{
return 1;
}
}
public class ClassC
{
List<IClassA<IInterface>> list = new List<IClassA<IInterface>>();
public void Add(IClassA<IInterface> item)
{
list.Add(item);
}
}
public class Test
{
public static void Run()
{
ClassC classC = new ClassC();
ClassA<ClassB> classA = new ClassA<ClassB>();
classC.Add(classA);
}
}
答案 1 :(得分:0)
根据设计的具体情况,您可以将ClassA
分为两部分:
public abstract class ClassA {
//Stuff that only works in terms of IInterface,
//maybe with some abstract methods, required constructors, etc
}
public class ClassA<T> : ClassA where T : IInterface {
//Stuff specific to T
}
然后,您将ClassA
存储在列表中,并将它们转换为已知的具体类型,作为/当您知道这是什么并且需要以这些方式工作时(例如,能够呼叫ClassA<T>
特定功能)