复合结构中的继承

时间:2009-06-11 12:28:08

标签: inheritance design-patterns composite

我遇到了与复合结构设计有关的问题。我有一个Expression抽象类,它描述了一个通用的数学表达式。这个想法是表达式可以是原子表达式(如“x”或“3”)或某种原子表达式的聚合(如summatories,productor,exponentiations等)。事实证明,复合模式很好地描述了这一点,例如,Summatory类继承自OperationTerm,而后者继承自Expression,并包含表达式术语的“augends”列表。

一切都很好,直到我尝试在某些属性的基础上专门化一些表达式;例如,如果一个表达式由一个单项式项的总和构成,它应该被“标记”为多项式,以便以对客户端代码透明的方式优化某些类型的操作(如积分或衍生物)。 (应该只处理Expression对象)。

任何人都知道如何设计这种结构(可能以可扩展的方式)?

4 个答案:

答案 0 :(得分:1)

你做不到。由于您希望使用不同的专用表达式,因此您必须继承Expression类型。

通常,当您定义可用于构建类似抽象语法树的类型时,您还提供了Visitor和/或修饰符,客户端代码可以使用它来从根目录浏览/修改复合表达式

至于构造一个新的复合表达式树,它应该没有问题,因为客户端代码知道它想要组装哪种表达式。

答案 1 :(得分:0)

如果表达式是不变的,即它们在创建之后永远不会写入,那么您只需创建专用类的实例(如果要保留客户端代码中的详细信息,则使用Factory模式)。如果它们不是常量,您可以使用State pattern,并将您所谈论的“标签”视为表达式的不同状态。

答案 2 :(得分:0)

如果CompositeExpression来自ExpressionPolynomial来自CompositeExpression,那么Polynomial也是Expression(就像你一样)说,对客户端代码透明。)

答案 3 :(得分:0)

我认为你的做法是错误的。不要担心将事物标记为多项式等。

确保从任何输入到实际数据结构的转换简单明了。

像Polynomial这样的东西可以在以后添加或稍后标记到你最初创建的通用结构上。

这种设计模式在计算机和自然语言的编译器/解释器中出现了很多。基本上,第一步是语法分析,您可以在其中构建语法结构,例如语法树。然后,存在语义分析,其中意义附加到语法。根据您的描述性术语判断,您可能正在实施数学表达式的解释器,因此这将是非常接近的匹配。

看看Kernighan和Pike的dc(桌面计算器)示例,Aho Hopcroft和Ullman关于数据结构/语言解释器/编译器的书籍,一些现代简单编译器的例子等。它们是设计模式的有效来源,如好吧(尽管它们早于该术语的流行)。