从基类对象中获取派生对象

本文关键字:对象 派生 获取 基类 | 更新日期: 2023-09-27 18:07:09

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

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("...");
}

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

问题是:在这种情况下,是否有可能访问具有正确类型的原始对象 VariableGrammar ?

我知道有可能强制转换它,但是我必须为每个可能的强制转换选项编写一个大的代码块。
另一种可能性是使用反射并通过这种方法调用方法,但这也不是那么好,因为当我更改方法名称时,我也必须在反射中更改它,因为我只能通过方法名称作为string调用方法。

从基类对象中获取派生对象

但问题是grammarRuleGrammar而不是VariableGrammar

实际上,两者都是,因为VariableGrammar派生自Grammar

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

这意味着Grammar类中的Parse方法是而不是标记为virtual。一旦你把它标记为virtual,并把override添加到VariableGrammar的实现中,问题就解决了。