没有继承的多个 类 中的相同代码
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;
}
// ...
我在 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;
}
// ...