c# - C# 泛型列表中的数组协方差

标签 c# generics abstract covariance ilist

我有一个例子,我想要一个抽象类接口(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/

相关文章:

c# - 在javascript中插入c#代码

c# - 编码 : Using Struct as a DataUtility/Library for Hardcode values (Constants)

c# - 转换整数数组以用于 SQL "IN"子句

generics - F#:在此程序点之前已在非统一实例化中使用了通用成员

java - MouseListener 方法被覆盖但编译器另有说明?

c# - SQL Server 行更新上的 ExecuteScalar

Java 泛型转换,非直接

java - 当参数类型不清楚时使用泛型工厂

Java:静态抽象(再次) - 如何解决的最佳实践

java - 访问抽象数组