我应该如何根据 Liskov 原则实现树节点类

How should I implement a tree node class with respect to the Liskov principle?

本文关键字:实现 树节点 原则 Liskov 何根 我应该      更新时间:2023-10-16

最近,我不得不为一个研究项目实现一个抽象查询树。基对象是一个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/