从基类对象获取派生对象

时间:2015-08-10 19:18:41

标签: c# inheritance

我正在编写一个用于学习目的的语法分析器,我遇到了继承问题。

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

1 个答案:

答案 0 :(得分:2)

  

但问题是grammarRuleGrammar而不是VariableGrammar

实际上,它都是,因为VariableGrammar来自Grammar

  

因此,调用Parse类的Grammar方法而不是VariableGrammar类。

这意味着Parse类中的Grammar方法标记为virtual。将virtual标记为override并将VariableGrammar添加到$stateProvider中的实施后,问题就会得到解决。