我有一个例子,我想要一个抽象类接口(interface)返回这样的东西
abstract class AnimalProcessor {
public abstract IList<Animal> ProcessResults();
}
然后是具体的例子
class GiraffeProcessor : AnimalProcessor {
public override IList<Animal> ProcessResults() {
return new List<Giraffe>();
}
}
class LionProcessor : AnimalProcessor {
public override IList<Animal> ProcessResults() {
return new List<Lion>();
}
}
问题是具体类需要有相同的签名来覆盖 ProcessResults()
方法,因此他们需要返回 IList<Animal>
,但是我要返回的实际数据是 IList<Lion>
, IList<Giraffe>
等等,但是调用代码必须做
GiraffeProcessor processor = new GiraffeProcessor();
IList<Animal> results = processor.GetResults();
它没有给我一个我想要的 Ilist。
问题
1) 以上代码无法编译。 giraffeProcessor 必须返回一个具体的 List<Animal>
,您可以用 Giraffe
填充它对象,但您构造返回的对象类型必须是 List<Animal>
.不理想。
2) 返回结果时,只能得到一个IList<Animal>
, 不是 IList<Giraffe>
.我试过显式转换为 IList<Giraffe>
和
IList<Giraffe> results = (IList<Giraffe>) processor.GetResults();
这给出了运行时错误,大概是因为返回的对象不是 IList<Giraffe>
,它是一个 IList<Animal>
其中包含 Giraffe
对象。
任何人都可以建议我的设计在这里做错了什么,因为我对实现这一目标的最佳方法有点困惑。
最佳答案
怎么样:
abstract class AnimalProcessor<T> where T : Animal {
public abstract IList<T> ProcessResults();
}
class GiraffeProcessor : AnimalProcessor<Giraffe> {
public override IList<Giraffe> ProcessResults() {
return new List<Giraffe>();
}
}
class LionProcessor : AnimalProcessor<Lion> {
public override IList<Lion> ProcessResults() {
return new List<Lion>();
}
}
关于c# - C# 泛型列表中的数组协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8726165/