2

我有一个代表不同语言结构的类层次结构:

Expression <- NumericLiteral
              UnaryExpression
              BinaryExpression
              IndexingExpression
              IteratedExpression
                   ...

这些类的对象形成复杂的树层次结构,我必须对其执行各种结构检查,例如,如果节点是 IteratedExpression,那么它的第一个子节点应该是 IndexingExpression。如果检查只涉及一个级别,我可以使用访问者模式,但在更复杂的情况下,如下例所示,我使用的是 instanceof。

void visit(IteratedExpression node) {
    if (!(node.getChild(0) instanceof IndexingExpression)) {
        // report error
    }
}

是正确使用 instanceof 还是我的设计有缺陷?有哪些替代方案?

由于提出了一些替代方案,我想强调问题的第一部分:

是正确使用 instanceof 还是我的设计有缺陷?

4

2 回答 2

3

像这样:

class Visitor {
  boolean indexingExpected;
  void startIteratedExpression() {
    indexingExpected = true;
  }
  void doIndexing() {
    indexingExpected = false;
  }
  void someOtherVisit() {
    if (indexingExpected) {
      throw IllegalStateException();
    }
  }
}
clas IteratedExpression {
  private List<Expression> children;
  public void visit(Visitor visitor) {
    visitor.startIteratedExpression();
    for(Expression child : childrenExpression) {
      child.visit(visitor);
    }
    visitor.endIteratedExpression();
  }
}
class IndexingExpression extends Expression {
  public void visit(Visitor visit) {
    visitor.doIndexing();
  }
}

如果您想使用访客,那么您的树中有多少级别并不重要。

于 2010-10-27T07:19:47.470 回答
1

添加一个抽象方法Expression并在其子级中实现它。
所以每个班级都有自己的检查。

于 2010-10-27T06:38:54.277 回答