在我回答关于visitor pattern
in的具体问题之前,请考虑下面的(示例)代码python
:
class Node:
def __init__(self):
self.children = []
def add(self, node):
self.children.append(node)
def check(self):
print("Node")
return True
def accept(self, visitor):
visitor.visit(self)
class NodeA(Node):
def check(self):
print("NodeA")
return True
class NodeB(Node):
def check(self):
print("NodeB")
return True
class NodeA_A(NodeA):
def check(self):
print("NodeA_A")
return True
class NodeA_B(NodeA):
def check(self):
print("NodeA_B")
return True
class NodeA_A_A(NodeA_A):
def check(self):
print("NodeA_A_A")
return False
class NodeRunner:
def visit(self, node):
node.check()
if len(node.children) > 0:
for child in node.children:
child.accept(self)
if __name__ == "__main__":
n = Node()
n1 = NodeA()
n2 = NodeB()
n11 = NodeA_A()
n12 = NodeA_B()
n111 = NodeA_A_A()
n.add(n1)
n.add(n2)
n1.add(n11)
n1.add(n12)
n11.add(n111)
v = NodeRunner()
v.visit(n)
当我运行它时,它会迭代地遍历所有节点类并返回以下内容:
Node
NodeA
NodeA_A
NodeA_A_A
NodeA_B
NodeB
这一切都很好,但现在是我的问题。您可能已经注意到每个check
-method 返回一个布尔值(假设这是一个实际的复杂方法)。
在上面的示例中,类中的每个check
-method都Node
返回True
except NodeA_A_A
。我想在访问期间以某种方式存储它,这样我就可以使所有基类失败。
这很难解释,让我举例说明:
- 如果
NodeA_A_A
返回False
,那么我想失败NodeA_A, NodeA and Node
。不管这些类返回什么。 - 如果
NodeB
返回False
,那么我想失败Node
。无论其他类返回什么。
因此,如果 achild-class
在某处失败(检查方法返回False
),我想使其所有基类都失败。
有没有人有任何想法?