에 있습니다. C# .Net 4.0 복합 패턴에서 일반적인 리프를 갖고 싶습니다. 내가 찾은 대부분의 예제는 전체 복합 트리를 통해 전파되는 기본 노드에 일반을 가지고 있습니다. 나는 그것을 원하지 않는다.일반 패턴이있는 복합 패턴이
다음 해결책을 찾았습니다. 두 개의 구현을 가진 INode라는 인터페이스. 하나는 기본적으로 INodes 사전입니다. 그것은 중복 된 leafs를 원하지 않기 때문에 사전입니다. ValueNode라고하는 다른 구현은 정보를 보유합니다. 이렇게하면 형식이 다른 리프 노드가 허용됩니다. 아무도 노드를 제거 할 수 있도록 내가 아이들을했습니다
public interface INode
{
string Name { get; }
}
public class CategoryNode : INode
{
public CategoryNode(string name)
{
this.Name = name;
this.Children = new Dictionary<string, INode>();
}
public string Name { get; private set; }
public List<string> Keys
{
get { return this.Children.Keys.ToList(); }
}
private Dictionary<string, INode> Children { get; set; }
public INode this[string key]
{
get { return this.Children[key]; }
}
public void Add(INode node)
{
this.Children.Add(node.Name, node);
}
}
public class ValueNode<T> : INode
{
public ValueNode(
string name,
T defaultValue)
{
this.Name = name;
this.Value = this.Default = defaultValue;
}
public ValueNode(
string name,
T defaultValue)
{
this.Name = name;
this.Value = this.Default = defaultValue;
}
public T Default { get; private set; }
public T Value { get; set; }
public string Name { get; private set; }
}
공지 개인 나열합니다. 나는이 솔루션에 만족하고 있습니다. 그러나 그것이 생성하는 사용법 구문은 약간 말투입니다. 예를 들면 :
((this.root["category"] as CategoryNode)["leaf"] as ValueNode<int>).Value = (node as ValueNode<int>).Value;
나는 나 구문을 단순화하기 위해
this.root["category"]["leaf"] = node;
같은 것을 누구 아이디어가 있습니까 상상했다 동안?
사전 <문자열, 사전 <문자열, 문자열 >>에 대해 생각해 보셨습니까? – rhughes
인덱서에서 '동적'을 반환 할 수 있습니다. 그러나 타입 안정성이 느슨합니다. 그러나 항상 정확한 유형으로 캐스팅해야하기 때문에 타입 세이프티가 필요하지 않습니다. –
@ rhughes : 아니요. 나는 카테고리가 카테고리 아이들을 가질 수 있다고 명시 적으로 언급하지 않았다. 따라서 루트 [ "category1"] [ "category2"] [ "leaf"]에 액세스 할 수 있기를 원합니다.이 중첩 사전을 사용하면 도움이됩니까? – Goosebumps