没有继承的多个 类 中的相同代码

Same Code in Multiple Classes without Inheritence

我在 Visual Studio 2015 年使用 AnTLR 的 C# 插件。AnTLR 有一个 class ParserRuleContext,所有解析器规则 class 都继承自该插件。解析器规则 classes 本身被声明为部分 classes,像这样:

public partial class SomeRuleContext : ParserRuleContext {
    /* stuff goes here */
}

ParserRuleContext 的定义如下所示:

public class ParserRuleContext : RuleContext
{
}

我正在为所有解析器规则实现我自己的部分 classes 以使用解析器树执行自定义操作。我希望能够将 属性 添加到 ParserRuleContext(以及其他 properties/fields/methods 之后),但 ParserRuleContext 未声明为 partial。由于规则 class 都已经继承自另一个 class,我无法让它们的部分实现也继承自 class。扩展方法并没有为我提供我想要的所有功能(无法添加 properties/fields),而接口让我从字面上 copy/pasting 将完全相同的代码放入每个 class。作为一名软件开发人员,最后一部分几乎让我感到恶心。

我考虑过添加一个指向包含我想要的功能的对象的单个常量 属性 的想法,但这个解决方案对我来说感觉很笨重,并且会向任何成员添加额外的调用的类型。所以这个:

SomeRuleContextInstance.CustomProperty = new FileInfo( "path" );

变成这样:

SomeRuleContextInstance.CommonFunctionality.CustomProperty = new FileInfo( "path" );

我希望有更好的解决方案。

任何人都可以提供一种方法来修改 ParserRuleContext 基础 class 或者没有我的 copy/paste 代码到处都是吗?这可以用反射来完成吗?

您可以在具体上下文 classes 和 ParserRuleContext 之间添加额外的继承级别。

只需创建一个 class 继承 ParserRuleContext:

public abstract class MyParserRuleContext : ParserRuleContext
{
    // Whatever you want here
}

然后通过以下选项告诉您的语法使用它:

grammar MyGrammar;

options {
     contextSuperClass = MyParserRuleContext;
}

// ...