C#通用列表中的数组协方差

我有一个例子,我想要一个抽象类接口来返回这样的东西

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&LT长颈鹿&GT 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>();
    }
}
上一篇:左耳听风 ARTS Week 001


下一篇:2021-2022 20211417《信息安全专业导论》第十周学习总结