Inheritance 复合结构中的继承
我有一个关于复合结构设计的问题。我有一个表达式抽象类,它描述了一个通用的数学表达式。其思想是,表达式可以是原子表达式(如“x”或“3”)或某种原子表达式的聚合(如求和、乘积、指数等)。结果证明,复合模式很好地描述了这一点,例如,summary类继承自OperationTerm,而该类又继承自表达式,并包含表达式项的列表“augends” 一切都很好,直到我尝试在某些属性的基础上专门化这些表达式;例如,如果表达式由单项式项的总和组成,则应将其“标记”为多项式,以便以对客户端代码透明的方式优化某些类型的操作(如积分或导数)(应仅处理表达式对象)Inheritance 复合结构中的继承,inheritance,design-patterns,composite,Inheritance,Design Patterns,Composite,我有一个关于复合结构设计的问题。我有一个表达式抽象类,它描述了一个通用的数学表达式。其思想是,表达式可以是原子表达式(如“x”或“3”)或某种原子表达式的聚合(如求和、乘积、指数等)。结果证明,复合模式很好地描述了这一点,例如,summary类继承自OperationTerm,而该类又继承自表达式,并包含表达式项的列表“augends” 一切都很好,直到我尝试在某些属性的基础上专门化这些表达式;例如,如果表达式由单项式项的总和组成,则应将其“标记”为多项式,以便以对客户端代码透明的方式优化某些类
任何人都知道我如何设计这种结构(可能是以可扩展的方式)?如果表达式是不变的,即它们在创建后从未写入,那么您可以只创建专门类的实例(如果希望不让客户机代码中的细节出现,请使用工厂模式)。如果它们不是不变性的,您可以使用,只需将您谈论的“标签”视为表达式的不同状态。如果表达式是不变性的,即它们在创建后从未写入,那么您可以只创建一个专门类的实例(如果您想不让客户机代码中的细节出现,请使用工厂模式)。如果它们不是不变性的,您可以使用,只需将您谈论的“标签”视为表达式的不同状态。您不能。因为您想要有不同的专用表达式,所以必须对表达式类型进行子类化 通常,当您定义可用于构建这样的抽象语法树的类型时,您还提供了一个和/或一个修饰符,客户机代码可用于从根浏览/修改复合表达式
至于构造一个新的复合表达式树,这应该不会有问题,因为客户端代码知道它想要组装什么类型的表达式。你不能。因为您想要有不同的专用表达式,所以必须对表达式类型进行子类化 通常,当您定义可用于构建这样的抽象语法树的类型时,您还提供了一个和/或一个修饰符,客户机代码可用于从根浏览/修改复合表达式
至于构造新的复合表达式树,它应该没有问题,因为客户机代码知道它想要组装什么类型的表达式。如果
复合表达式
是从表达式
派生的,而多项式
是从复合表达式
派生的,然后多项式
也是一个表达式
(正如您所说,对客户端代码是透明的)。如果复合表达式
是从表达式
派生出来的,多项式
也是一个表达式
(正如您所说,对客户端代码是透明的)。我认为您的做法是错误的。不要担心将事物标记为多项式等
只需确保从任何输入到实际数据结构的转换都简单明了
多项式之类的东西可以稍后添加或标记到最初创建的泛型结构上
这种设计模式在计算机和自然语言的编译器/解释器中经常出现。基本上,第一步是语法分析,在这里你建立了一个语法结构,例如语法树。然后,还有语义分析,在语义分析中,意义附在语法上。从你的描述术语来看,你可能是修正数学表达式的解释器,所以这将是一个非常接近的匹配
看看Kernighan和Pike的dc(桌面计算器)示例,Aho Hopcroft和Ullman关于数据结构/语言解释器/编译器的书籍,一些现代简单编译器的示例等。它们也是设计模式的丰富来源(尽管它们早于术语的流行).我认为你走错了方向。不要担心将事物标记为多项式等 只需确保从任何输入到实际数据结构的转换都简单明了 多项式之类的东西可以稍后添加或标记到最初创建的泛型结构上 这种设计模式在计算机和自然语言的编译器/解释器中经常出现。基本上,第一步是语法分析,在这里你建立了一个语法结构,例如语法树。然后,还有语义分析,在语义分析中,意义附在语法上。从你的描述术语来看,你可能是修正数学表达式的解释器,所以这将是一个非常接近的匹配 看看Kernighan和Pike的dc(桌面计算器)示例,Aho Hopcroft和Ullman关于数据结构/语言解释器/编译器的书籍,一些现代简单编译器的示例等。它们也是设计模式的丰富来源(尽管它们早于术语的流行)