面向对象的嵌套字典数据结构

时间:2014-05-21 14:32:59

标签: c# data-structures dictionary plist abstract-syntax-tree

我试图为lisp样式的plist创建一个抽象语法。例如:

(:A 1 :B (:X 3 :Y 2) :C 4)

这是迄今为止的语法(在EBNF中):

Plist -> { Key Value }*
Key -> string
Value -> string | Plist

我需要用C#表示这个数据结构。不幸的是,我正努力为非终结者创建课程。这在像python这样的动态类型语言中看似微不足道(dict的值为字符串或dicts)。但是在C#中,数据结构的用户如何知道某个值是plist还是以多态方式的字符串?

这是我到目前为止的C#代码:

interface Value { }

class PList : Value
{
    private Dictionary<string, Value> Dict;

    public Value this[string key]
    {
        get
        {
            return Dict[key];
        }
    }
}

class String : Value
{
    public string Datum { get; set; }
}

1 个答案:

答案 0 :(得分:3)

你肯定是在正确的轨道上。您尝试使用的模式是Composite Pattern。在此模式中,常见行为或常见抽象用于叶子和内部节点(在树中和示例中)。然后在复合中使用抽象,如:

public interface IValue
{
    public void OperationOnValue();
    public List<IValue> GetChildren();
}

public class CompositePList : IValue
{
    private Dictionary<string, IValue> dict;

    public void OperationOnValue()
    {
        foreach(var things in dict)
        {}//things to do
    }

    public List<IValue> GetChildren()
    {
        return dict.Select(keyValue => keyValue.Value).ToList();
    }
}

public class StringValue : IValue
{
    private string leafValue;
    public void OperationOnValue()
    {}//thing to do

    public List<Children> GetChildren()
    {
        return null; //or return new List<Children>()
    }
}

使用此设计,您可以拥有一个根IValue,然后在其上进行多态调用OperationOnValue()。您还有其他功能吗?