我试图为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; }
}
答案 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()
。您还有其他功能吗?