Я понял, что моя попытка абстрагировать проблему затруднила понимание моих ограничений.Ниже приведен пример, который близок к реализации.Примечания, приведенные ниже, должны помочь, поэтому вам не нужно копаться в классах .NET.
- Srgs * - это классы .NET в пространстве имен "System.Speech.Recognition.SrgsGrammar"
- SrgsElement является производным от SrgsItem
- C # не поддерживает " универсальное отклонение "!Это означает, что, вопреки вашей интуиции, рекурсивные вызовы не могут перейти в «Action», даже если SrgsItem »является« SrgsElement.
Я смог решить свою проблему, создав перегрузку CreateSrgsNodes с Arg1,Действие.Однако это означает сохранение одного и того же кода в обоих местах, который не проходит тест на запах.Если кто-то может улучшить это, пожалуйста, подтвердите новый ответ.
public void CreateSrgsNodes(Action<SrgsElement> addSrgsChild, CurrentNode)
{
foreach (GmlModel gmlModel in gmlModels)
{
if (<Pseudo Code: Is CurrentNode of type SrgsItem>)
{
var srgsOneOf = new SrgsOneOf();
addSrgsChild(srgsOneOf);
//Note: Arg1 is type SrgsElement
CreateSrgsNodes(srgsOneOf.Add, CurrenNode.getChild);
}
if (<Pseudo Code: Is CurrentNode of type SrgsOneOf>)
{
var srgsOneOf = new SrgsOneOf();
addSrgsChild(srgsOneOf);
//Note: Arg1 is type SrgsItem (FAILS without an overload)
CreateSrgsNodes(Action<SrgsItem>, CurrentNode))
CreateSrgsNodes(srgsOneOf.Add,CurrenNode.getChild); created
}
}
}