我正在编写一个用于学习目的的语法分析器,我遇到了继承问题。
return if Rails.env.production?
class MailPreview < MailView
include FactoryGirl::Syntax::Methods
# ...
end
我创建了一个var grammars = new Grammar[] { new VariableGrammar() };
this.GrammarRules = new List<Grammar>(grammars);
的列表,Grammar
继承自VariableGrammar
。但是在后面的编码阶段,不同类型的列表中会有更多的对象,所有这些对象都继承自Grammar
。当我想访问一个元素时,我可以像这样使用Grammar
:
foreach
但问题是var grammars = new Grammar[] { new VariableGrammar() };
this.GrammarRules = new List<Grammar>(grammars);
foreach (var grammarRule in this.GrammarRules)
{
grammarRule.Parse("...");
}
是grammarRule
而不是Grammar
。因此,调用VariableGrammar
类的Parse
方法而不是Grammar
类。
问题是:
在这种情况下是否有可能使用正确的类型访问原始对象 VariableGrammar
?
我知道有可能将其投射,但是我必须为每个可能的投射选项编写一个大代码块。
另一种可能是使用反射并通过这种方法调用方法,但这不是很好,因为当我更改方法名称时我也必须在反射中更改它,因为我只能通过方法名称调用方法作为VariableGrammar
。
答案 0 :(得分:2)
但问题是
grammarRule
是Grammar
而不是VariableGrammar
。
实际上,它都是,因为VariableGrammar
来自Grammar
因此,调用
Parse
类的Grammar
方法而不是VariableGrammar
类。
这意味着Parse
类中的Grammar
方法不标记为virtual
。将virtual
标记为override
并将VariableGrammar
添加到$stateProvider
中的实施后,问题就会得到解决。