Ну если максимальная глубина дерева конечна и заранее известна, то можно попробовать что-то такое:
public interface IElement<T> {
string Name { get; }
List<T> Children { get;}
}
public interface IElement<T> {
string Name { get; }
List<T> Children { get;}
}
public abstract class BaseElement<T> : IElement<T> {
public string Name {
get { return"name"; }
}
private readonly List<T> children = new List<T>();
public List<T> Children {
get { return children; }
}
}
public class FirstElement<T> : BaseElement<T> {
}
public class SecondElement<T> : BaseElement<T> {
}
public class LastLevelElement {
}
В данном случае Т — тип дочерних узлов.
Но в таком случае при создании узла нужно будет указывать типы допустимых детей аж до последнего уровня:
var el = new FirstElement<SecondElement<LastLevelElement>>();
А>Но есть условие, что элементы одного уровня должны иметь один тип.
Строго один? Или некий тип и, возможно, его наследников? То есть, "следующее добавление допустимо", если ThirdElement является наследником SecondElement или нет?
А> IElement el = new OneElement();
А> el.Childs.Add( SecondElement() );
А> el.Childs.Add( ThirdElement() );
?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, kometa_triatlon, Вы писали:
_>Но в таком случае при создании узла нужно будет указывать типы допустимых детей аж до последнего уровня:
Я бы сделал так:
interface INode<T>
{
ICollection<T> Children { get; }
}
interface INodeLevel1 : INode<INodeLevel2>
{
}
interface INodeLevel2 : INode<INodeLevel3>
{
}
interface INodeLevel3
{
}
class NodeLevel1 : INodeLevel1
{
public ICollection<INodeLevel2> Children
{
get { throw new NotImplementedException(); }
}
}
class NodeLevel2 : INodeLevel2
{
public ICollection<INodeLevel3> Children
{
get { throw new NotImplementedException(); }
}
}
class NodeLevel3 : INodeLevel3
{
}
class Test
{
void Foo()
{
var nodeLevel3 = new NodeLevel3();
var nodeLevel2 = new NodeLevel2();
nodeLevel2.Children.Add(nodeLevel3);
var nodeLevel1 = new NodeLevel1();
nodeLevel1.Children.Add(nodeLevel2);
}
}
+1
Но в любом случае, нужно знать максимальную глубину дерева.
Впрочем, судя по постановке задачи, это условие выполняется.
Если же типизация нужна только до определенного уровня, то можно сделать так: