Generics e arquitetura pai / filho
Estou construindo uma arquitetura comherdáve relações genéricas e pais-filhos. Tenho um grande problema: não posso conscientizar a criança e os pais do tipo um do outro, apenas um dos doi
Preciso que o filho e o pai estejam cientes do tipo um do outr
Cenário : Pai conhece o tipo filho, mas filho conhece pai genérico apenas com filhos genérico
public class Child
{
public Parent<Child> Parent;
}
public class Parent<TChild>
where TChild : Child
{
public List<TChild> Children;
}
Scenario 2: O filho conhece o tipo de pai, mas o pai conhece apenas filhos genéricos com pai genéric
public class Child<TParent>
where TParent : Parent
{
public TParent Parent;
}
public class Parent
{
public List<Child<Parent>> Children;
}
Scenario 3: O cenário utópico, mas inatingível:
public class Child<TParent>
where TParent : Parent
{
public TParent Parent;
}
public class Parent<TChild>
where TChild : Child
{
public List<TChild> Children;
}
Certamente, o cenário 3 não será compilado, porque Pai e Filho usam um segundo tipo genérico que seriatheir own, mas não posso (ou pelo menos não sei como!) especificar que é o seu próprio tip
Estou caindo em algum tipo de loop / recursão / arremesso infinito aqui, por favor me ajude antes de me afogar.
Boa sorte
EDITA: Se eu não estava claro, posso fazer referência aos meus tipos sim, mas se o usuário deriva de Child no FooChild e acessar os filhos do pai do FooChild, eles serão apenas Child, e não FooChild, como deveria ser.
xemplo de falha com o cenário:
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!
}
}
}
xemplo de falha com o cenário:
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!
}
}
}