我有一个Question
个对象。每个Question
都包含后续问题的实例,应在之后显示。在问题显示期间,传递string
参数。
如果我有Question
:Q1,Q2,Q3,Q4,Q1可能包含以下数据:
Q1:
questions: {
"abc": Q2,
"def": Q3,
"xyz": Q2
}
选择"abc"
后,Q2实例将传递"abc"
字符串并显示。
我实施它的方式:
class Question {
public void Show(string option){
// ... display
var selectedOption = GetSelected();
// questions["abc"] = Q2
questions[selectedOption].Show(selectedOption);
}
我立刻感觉到我在某个地方做了一个非常错误的转弯。它不会发生,但是有足够多的问题我会溢出调用堆栈。即使在现实世界的情况下,它也会使堆栈痕迹变得可怕且难以理解。
我想把它改成:
class Question {
public Question Show(string option){
// ... display
var selectedOption = GetSelected();
// questions["abc"] = Q2
var next = questions[selectedOption];
next.SetValue(selectedOption);
return next;
}
并从外面逐个调用它。但我担心整个想法都存在缺陷,所以我的问题是:我的修改过的想法至少是半体面的,还是有更好的方法来实现这种基于用户输入的链接对象执行?
答案 0 :(得分:0)
将问题链的生成与显示问题分开。生成链可能如下所示:
for (Question q = initialQuestion; q.Next != null; q = q.Next)
yield return q;
n#34;显示"它们:
foreach (var q in GetQuestionChain(initialQuestion))
q.Show(); //No recursion.
答案 1 :(得分:0)
现在我跟着以下:
class Question {
private Dictionary<string, Question> questions = ...
public Question Show(){
// ... display
var selectedOption = GetSelected();
// questions["abc"] = Q2
var next = questions[selectedOption];
if(next != null)
next.SetValue(selectedOption);
return next;
}
然后
{ \\ in some method
Question q = Q1;
do{
q = q.Show();
} while( q != null)
}