我应该如何根据 Liskov 原则实现树节点类
How should I implement a tree node class with respect to the Liskov principle?
最近,我不得不为一个研究项目实现一个抽象查询树。基对象是一个ASTNode
,但实际的树节点是派生类:表达式节点、比较节点、操作数节点等。每种类型的节点都有自己的成员,例如操作数节点、参数列表等。
递归生成此树的分析函数需要返回ASTNode
类型,因为它们只返回指针,而不管生成的树的根目录下是什么类型的节点。
这意味着解析树的函数需要先查询树中的每个节点的类型,然后再对其进行操作。这可以通过动态强制转换或typeid来完成,但是SO和Google样式指南会对我违反Liskov替换原则和所有运行类型检查感到愤怒。
我不能把在节点上运行的函数放在节点子类本身中,因为这些树可以在应用程序的不同部分以几种不同的方式使用。有没有更好的方法来构造我的树?
这看起来很适合访客模式。
如何在 Python 中编写抽象语法树的访问者模式?
http://en.wikipedia.org/wiki/Visitor_pattern
也许复合模式也会很有用。另请查看这篇文章:
http://blog.jooq.org/2012/04/10/the-visitor-pattern-re-visited/
相关文章:
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 没有从"树节点"到"树节点*"的可行转换
- 语言分析的二叉树实现 - 子节点:不起作用
- 对树节点使用 CString 时出现内存泄漏
- 预分配的节点向量中的无锁树节点分配
- 接受来自键盘的树节点以确定其高度
- C++ Eclipse:二叉搜索树节点>数据=变量似乎不起作用
- C++错误(从不兼容的类型"void"分配给树节点*)
- UWP:在树节点中将文本设置为粗体
- 树节点之间的最大距离中的运行时错误
- 想要以最新的添加节点完整返回树节点的根
- 如何在 C++ 与 CPLEX 中实现宏节点回调
- 使用深度第一次搜索的无向图中的图形调查无法实现的节点
- 从GCC功能树节点中检索函数参数
- 如何映射数组元素以选择二进制树节点
- Boost::p tree - 访问列表中包含的属性树节点
- 我应该如何根据 Liskov 原则实现树节点类
- B+树节点实现
- AVL树实现有节点或没有节点
- 如何在树访问器中实现每个节点的缓存