c# - 访问者模式——接口(interface)与抽象类

标签 c# interface abstract-class visitor-pattern

我目前正在尝试为更简单的语言编写一个简单的编译器,但我在添加 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/

相关文章:

c# - HTML 敏捷包

c# - 使用反射创建枚举

c# - 如何在ConfigureServices之外配置IdentityOptions?

c# - 在 Visual Studio 中的 C# 泛型类/方法上设置函数断点?

python - 从抽象方法继承包装器

vb.net - 接口(interface)实现它自己的方法

delphi - 我可以创建一个从 Delphi 中的类和接口(interface)继承的类吗?

c# - 在C++中定义一个需要在C#和C++中实现的接口(interface)

python - 类工厂和抽象基类

c++ - 抽象类和虚方法问题 : "cannot allocate an object of abstract type"