Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 复合结构中的继承_Inheritance_Design Patterns_Composite - Fatal编程技术网

Inheritance 复合结构中的继承

Inheritance 复合结构中的继承,inheritance,design-patterns,composite,Inheritance,Design Patterns,Composite,我有一个关于复合结构设计的问题。我有一个表达式抽象类,它描述了一个通用的数学表达式。其思想是,表达式可以是原子表达式(如“x”或“3”)或某种原子表达式的聚合(如求和、乘积、指数等)。结果证明,复合模式很好地描述了这一点,例如,summary类继承自OperationTerm,而该类又继承自表达式,并包含表达式项的列表“augends” 一切都很好,直到我尝试在某些属性的基础上专门化这些表达式;例如,如果表达式由单项式项的总和组成,则应将其“标记”为多项式,以便以对客户端代码透明的方式优化某些类

我有一个关于复合结构设计的问题。我有一个表达式抽象类,它描述了一个通用的数学表达式。其思想是,表达式可以是原子表达式(如“x”或“3”)或某种原子表达式的聚合(如求和、乘积、指数等)。结果证明,复合模式很好地描述了这一点,例如,summary类继承自OperationTerm,而该类又继承自表达式,并包含表达式项的列表“augends”

一切都很好,直到我尝试在某些属性的基础上专门化这些表达式;例如,如果表达式由单项式项的总和组成,则应将其“标记”为多项式,以便以对客户端代码透明的方式优化某些类型的操作(如积分或导数)(应仅处理表达式对象)


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

如果表达式是不变的,即它们在创建后从未写入,那么您可以只创建专门类的实例(如果希望不让客户机代码中的细节出现,请使用工厂模式)。如果它们不是不变性的,您可以使用,只需将您谈论的“标签”视为表达式的不同状态。

如果表达式是不变性的,即它们在创建后从未写入,那么您可以只创建一个专门类的实例(如果您想不让客户机代码中的细节出现,请使用工厂模式)。如果它们不是不变性的,您可以使用,只需将您谈论的“标签”视为表达式的不同状态。

您不能。因为您想要有不同的专用表达式,所以必须对表达式类型进行子类化

通常,当您定义可用于构建这样的抽象语法树的类型时,您还提供了一个和/或一个修饰符,客户机代码可用于从根浏览/修改复合表达式


至于构造一个新的复合表达式树,这应该不会有问题,因为客户端代码知道它想要组装什么类型的表达式。

你不能。因为您想要有不同的专用表达式,所以必须对表达式类型进行子类化

通常,当您定义可用于构建这样的抽象语法树的类型时,您还提供了一个和/或一个修饰符,客户机代码可用于从根浏览/修改复合表达式


至于构造新的复合表达式树,它应该没有问题,因为客户机代码知道它想要组装什么类型的表达式。

如果
复合表达式
是从
表达式
派生的,而
多项式
是从
复合表达式
派生的,然后
多项式
也是一个
表达式
(正如您所说,对客户端代码是透明的)。

如果
复合表达式
是从
表达式
派生出来的,
多项式
也是一个
表达式
(正如您所说,对客户端代码是透明的)。

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

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

多项式之类的东西可以稍后添加或标记到最初创建的泛型结构上

这种设计模式在计算机和自然语言的编译器/解释器中经常出现。基本上,第一步是语法分析,在这里你建立了一个语法结构,例如语法树。然后,还有语义分析,在语义分析中,意义附在语法上。从你的描述术语来看,你可能是修正数学表达式的解释器,所以这将是一个非常接近的匹配


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

我认为你走错了方向。不要担心将事物标记为多项式等

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

多项式之类的东西可以稍后添加或标记到最初创建的泛型结构上

这种设计模式在计算机和自然语言的编译器/解释器中经常出现。基本上,第一步是语法分析,在这里你建立了一个语法结构,例如语法树。然后,还有语义分析,在语义分析中,意义附在语法上。从你的描述术语来看,你可能是修正数学表达式的解释器,所以这将是一个非常接近的匹配

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