我有一个例子,我想要一个抽象类接口来返回这样的东西
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>,但是我想要返回的ACTUAL数据是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<长颈鹿> results =(IList< Giraffe>)processor.GetResults();
这会产生运行时错误,大概是因为返回的对象不是IList< Giraffe>,它是IList< Animal>其中包含长颈鹿的物体.
任何人都可以通过我的设计向我提出我在做错的事情,因为我有点难以实现这一目标.
解决方法:
怎么样:
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>();
}
}