从基类对象中获取派生对象
本文关键字:对象 派生 获取 基类 | 更新日期: 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("...");
}
但问题是grammarRule
是Grammar
而不是VariableGrammar
。因此,调用Grammar
类的Parse
方法而不是VariableGrammar
类。
问题是:在这种情况下,是否有可能访问具有正确类型的原始对象 VariableGrammar
?
我知道有可能强制转换它,但是我必须为每个可能的强制转换选项编写一个大的代码块。
另一种可能性是使用反射并通过这种方法调用方法,但这也不是那么好,因为当我更改方法名称时,我也必须在反射中更改它,因为我只能通过方法名称作为string
调用方法。
但问题是
grammarRule
是Grammar
而不是VariableGrammar
。
实际上,两者都是,因为VariableGrammar
派生自Grammar
因此调用
Grammar
类的Parse
方法而不是VariableGrammar
类。
这意味着Grammar
类中的Parse
方法是而不是标记为virtual
。一旦你把它标记为virtual
,并把override
添加到VariableGrammar
的实现中,问题就解决了。