Мне стыдно признаться, что я сижу над этой проблемой много-много часов.Но я просто хочу реализовать это так, как это структурировано на диаграмме ниже ...
Я хочу смоделировать мир с континентами / странами / государствами и городами.Каждая модель имеет ссылку на своего родителя и список ссылок на своих потомков, за исключением того, что в мире есть только дети (потому что для нее не может быть родителя), а в городе есть только ссылка на родителя, потому что она не идет глубже.(Я хочу реализовать его так, чтобы, например, у «Мира» не было родительского поля, также у «города» нет поля List<Children>
.
Я собирался реализовать его в древовидной структуре данных, такой какследующее (я пропустил реализации):
Чтобы дать вам представление о коде интерфейсов , я включил здесь минимум этого:
public interface IRoot<TChild>
{
List<TChild> Children { get; set; }
void AddChild(TChild child);
}
public interface ILeaf<TParent>
{
TParent Parent { get; set; }
}
public interface INode<TParent, TChild> : IRoot<TChild>, ILeaf<TParent> { }
И небольшой код реализации :
public class Root<TChild> : IRoot<TChild>
{
public List<TChild> Children { get; set; }
public void AddChild(TChild child) { //... }
}
public class Leaf<TParent> : ILeaf<TParent>
{
public TParent Parent { get; set; }
}
public class Node<TParent, TChild> : INode<TParent, TChild>
{
private IRoot<TChild> root;
private ILeaf<TParent> leaf;
//...
}
И, наконец, код классов, которые я хочу структурировать :
public class World : Root<Continent> { }
public class Continent : Node<World, Country> { }
public class Country : Node<Continent, State> { }
public class State : Node<Country, City> { }
public class City : Leaf<City> { }
Здесь возникает проблема:
Теперь, чтобы добавить дочерний объект в Root<TChild>.AddChild(TChild)
Мне нужен доступ к <TChlid>.Parent
, поэтому мне нужно ограничить универсальныйTChild
до ILeaf<IRoot<TChild>>
примерно так:
public class Root<TChild> : IRoot<TChild> where TChild : ILeaf<Root<TChild>>
{
public void AddChild(TChild child)
{
child.Parent = this;
}
}
Но при этом я получаю сообщение об ошибке
CS0311 C # Тип нельзя использовать в качестве параметра типа в универсальном типеили метод. Нет неявного преобразования ссылки из в.
В этой строке
public class World : Root<Continent> { }