- на обоих базовых классах. У меня сработало нормально, но вам нужно выполнить следующее приведение, чтобы установить родителя:
ою архитектуру снаследственный родовые и детско-родительские отношения. У меня есть одна большая проблема: я не могу сделать так, чтобы и ребенок, и родитель знали о типе друг друга, только один из двух.
Мне нужно, чтобы и ребенок, и родитель знали о типе друг друга.
Сценарий 1: Parent знает тип потомка, но child знает только родителя-родителя с потомками.
public class Child
{
public Parent<Child> Parent;
}
public class Parent<TChild>
where TChild : Child
{
public List<TChild> Children;
}
Сценарий 2: Child знает родительский тип, но parent знает только общих потомков с родителем.
public class Child<TParent>
where TParent : Parent
{
public TParent Parent;
}
public class Parent
{
public List<Child<Parent>> Children;
}
Сценарий 3Утопический, но недостижимый сценарий
public class Child<TParent>
where TParent : Parent
{
public TParent Parent;
}
public class Parent<TChild>
where TChild : Child
{
public List<TChild> Children;
}
Конечно, сценарий 3 не будет компилироваться, потому что Parent и Child используют второй универсальный тип, который будетих собственный типа, но я не могу (или, по крайней мере, не знаю, как!) указать, что это их собственный тип.
Я попадаю в какую-то бесконечную петлю / рекурсию / бросок мяча, пожалуйста, помогите мне, прежде чем я утону.
Удачи.
РЕДАКТИРОВАТЬ: Если мне неясно, я могу сослаться на свои типы да, но если пользователь выводит Child в FooChild и обращается к дочерним элементам родителя FooChild, это будут только Child, а не FooChild, как и должно быть.
Пример отказа со сценарием 1:
public class Child
{
public Parent<Child> Parent;
}
public class Parent<TChild>
where TChild : Child, new()
{
public List<TChild> Children;
}
public class FooChild : Child
{
public int Required;
public void Bar()
{
foreach (Child child in this.Parent.Children)
{
int x = child.Required; // cannot be accessed!
}
}
}
Пример отказа со сценарием 2:
public class Child<TParent>
where TParent : Parent
{
public TParent Parent;
}
public class Parent
{
public List<Child<Parent>> Children;
}
public class FooChild : Child<Parent>
{
public int Required;
public void Bar()
{
foreach (Child<Parent> child in this.Parent.Children)
{
int x = child.Required; // cannot be accessed!
}
}
}