Я пишу библиотеку, которая отображает кучу ребенка объектов на экран. Детский объект является абстрактным и предназначен для пользователей этой библиотеки, чтобы вывести свой собственный ребенок из этого абстрактного класса.Листинг типа C# на общий интерфейс
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.
}
}
}
Как я могу решить эту проблему? Это что-то общего с ковариантными дженериками или тем, что когда-либо (я не знаком с концепцией ковариации)?
'IParent
@MarcGravell: Спасибо, исправлено. Сменила ограничение. – Heinzi
Оцените дополнительное объяснение в редактировании. Очень помог. Благодарю. – Jake