我有一个代表不同语言结构的类层次结构:
Expression <- NumericLiteral
UnaryExpression
BinaryExpression
IndexingExpression
IteratedExpression
...
这些类的对象形成复杂的树层次结构,我必须对其执行各种结构检查,例如,如果节点是 IteratedExpression,那么它的第一个子节点应该是 IndexingExpression。如果检查只涉及一个级别,我可以使用访问者模式,但在更复杂的情况下,如下例所示,我使用的是 instanceof。
void visit(IteratedExpression node) {
if (!(node.getChild(0) instanceof IndexingExpression)) {
// report error
}
}
是正确使用 instanceof 还是我的设计有缺陷?有哪些替代方案?
由于提出了一些替代方案,我想强调问题的第一部分:
是正确使用 instanceof 还是我的设计有缺陷?