2011-12-07 323 views
2

我有一个类Form,其中包含Question项目的散列。避免循环参考

class Form 
{ 
    Dictionary < int , Answer> listOfQuestions; 
} 

class Question 
{ 
    int questionId = 2; 
    int dependsOnQuestion = 1; 
    string answer; 
    public bool IsDependancyMet() {/*problem*/} 
} 

我想一个问题依赖于另一个问题,比方说一个答案,如果答案问题1是“已婚”,显示问题2,否则,不显示它。

什么是正确的实施方式?

是否会将表单实例的引用添加到问题实例中,以便让后面的一个访问问题的散列。虽然我不喜欢它。

另一种方法是向Form类中添加一个方法,该方法接收问题ID并检查是否符合所有依赖关系,但问题应该再次注意表单实例。

关于底线: 谁应该检查依赖关系以及如何让系统模块化,并且每个类都尽可能少地意识到它的环境?或者至少避免周期参考。

在此先感谢。

回答

0

什么沿着

class Form 
{ 
    Dictionary < int , Answer> listOfQuestions; 
    int firstQuestion; 

    public void NextQuestion() { 
     // ... cycle through `listOfQuestions` looking for a question 
     // whose dependencies are fullfilled and ask it. 
    } 
} 

class Question 
{ 
    // ... 
    public List<int> GetDependencies(); 
    public void Ask(); 
    // ... 
} 

Form东西线跟踪全球“质疑”状态,而个别问题,只有他们的直接依赖的知识。对我来说,这似乎是一个相对干净的方法。

+0

感谢您的回答。 在任何情况下,我有一个Form.Display()遍历问题列表,并在每个问题上调用.Ask()或.Render()。问题是这个问题不一定以相同的顺序出现。问题12可能取决于问题4的答案; 无论哪种情况,您的解决方案都意味着表单的Render方法将负责决定是否显示问题,因为它可以访问每个问题答案和依赖关系。 我明白你的答案。谢谢。 – Alex