我正在编写一个将一堆子对象呈现到屏幕的库。子对象是抽象的,它旨在供该库的用户从该抽象类派生出他们自己的子对象。
public abstract class Child : IRenderable {}
public interface IParent<T> where T : Child
{
IEnumerable<T> Children { get; }
}
复杂之处在于我没有可以使用的 IParent 列表,相反,我有一堆 IRenderables。图书馆的用户应该写这样的东西:
public class Car : IRenderable { }
public class Cow : IRenderable, IParent<Calf> { }
public class Calf : Child { }
// note this is just an example to get the idea
public static class App
{
public static void main()
{
MyLibraryNameSpace.App app = new MyLibraryNameSpace.App();
app.AddRenderable(new Car()); // app holds a list of IRenderables
app.AddRenderable(new Cow());
app.Draw(); // app draws the IRenderables
}
}
在 Draw() 中,库应该强制转换并检查 IRenderable 是否也是 IParent。但是,由于我不了解小牛,所以我不知道将牛投进什么。
// In Draw()
foreach(var renderable in Renderables)
{
if((parent = renderable as IParent<???>) != null) // what to do?
{
foreach(var child in parent.Children)
{
// do something to child here.
}
}
}
我该如何克服这个问题?这与协方差泛型或其他任何事情有关吗(我不熟悉协方差概念)?