我目前正在尝试为更简单的语言编写一个简单的编译器,但我在添加 Visitor
模式时遇到了问题。
我有一个如下所示的 ILanguageVisitor
界面:
interface ILanguageVisitor {
void Visit(GlobalStructure cs);
void Visit(GotoStructure cs);
void Visit(IfStructure cs);
void Visit(ElseIfStructure cs);
void Visit(ElseStructure cs);
...
}
必须实现所有这些方法才能为特定架构创建具体的访问者。但除此之外,还有一些方法和字段应该对所有可能的访问者都是通用的。
例如, block 的功能由两个或多个 Visit
调用组成,例如:
Visit(If)
...
Visit(Else)
...
Visit(EndIf)
Visit(For)
...
Visit(EndFor)
这是因为 block 开始和终止的规则(比如一个 block 中不能有两个 else
,或者那个子 block 不能被父 block 终止,例如 For ... 如果 ... EndFor
).
我的问题是:如果我有一个应该对所有 Visitor
通用的行为,我是否应该创建一个抽象的 Visitor 类,这将使这些特定方法成为 virtual
和其他摘要
?
如果我在其基础上添加一个默认行为,是否会丢失 Visitor
的积分?
最佳答案
在这种情况下,我认为最好的解决方案是同时拥有一个接口(interface)和一个实现该接口(interface)并允许用户覆盖某些方法的基类。这样,用户可以决定他是否愿意:
- 继承基类并已经为他实现了部分或大部分功能(可能会以灵 active 为代价)
- 亲自实现整个界面,实现最大程度的控制和灵 active 。
关于c# - 访问者模式——接口(interface)与抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22588452/