2014-03-29 31 views
0

对不起,如果之前有类似的问题。我会尝试尽可能具体。治疗不同的对象是一样的吗?迭代器?

我正在c#中测验/学习闪存卡应用程序。这将允许用户创建一些用于自我评估的学习卡。我希望用户有能力创建不同类型的卡片,也就是说只有一个问题和答案的地方,比如两者都是字符串,一个是存在问题的地方,另一个是存在问题的地方,然后是多个答案选择,一个是缺少单词的短语。理想情况下,我希望稍后再打开以延长我可能想要添加一个由图或图像组成的问题,其中缺少的单词是需要提供的标签。

单独设计这些东西可能是可行的。我被卡住的地方是知道如何设计这样一种方式,即用户可以尝试进行测试,并且系统可以通过卡片循环,使得用户呈现的下一张卡片是来自该集合,可以是我在下面提到的任何一种类型。我可以定义某种通用接口,例如ICard,并遍历该类型的集合,但是我总是必须真正知道我拥有哪种类型,以便我可以向用户显示特定卡所需的内容,例如,如果它是多种选择类型的卡,则显示多个选项。关于这种设计的东西似乎不太正确,但我不确定采取什么其他方法。

谢谢

+0

这高度依赖于您使用的UI技术(WPF,ASP.NET,MVC等)。提供更多关于此的信息以改善可能的答案。 – Bas

+0

我会使用MVC。目前我只是想要定义一些核心类。我可以看到这个问题,所以我宁愿尝试解决它,或者至少有一个想法如何。 – mageets

回答

0

使用ICard作为通用卡和其他每种类型卡的接口。

class MyCard: IMyCard, ICard 
{ ... } 

遍历使用ICARD,当你到了渲染部分使用

if(object is IMyCard) 
    renderIMyCard(); 

要确定哪张卡的具体类型,你正在使用。严格地说,你并不需要为每种类型使用一个接口,但是如果你这样做的话,使用一个接口将使代码更容易进行单元测试。

另一种可能的方法是将卡的类型作为枚举属性嵌入到ICard中。但我认为从长远来看界面方法会更好地为您服务。

+0

好的,谢谢。因此,如果我需要根据类型呈现不同的内容,我就不得不知道该类型,例如,图像,可能答案的列表。我也希望能够检查每个问题的用户提供的答案。由于它们不同,所提供的答案会不同,例如一个字符串与列表。在ICard中使用bool CheckAnswer(object suppliedAnswer)是否可以接受,然后让每种类型都实现它们自己的版本? – mageets

+0

如果可行,是的 –

0

为每种类型的卡定义模型类,并使用一个通用的基础接口。然后,定义处理这些模型类的渲染的相应View类。这里有一个例子:

型号:

interface IFlashCard { ... } 

class MultipleOptionFlashCard : IFlashCard 
{ 
    String question; 
    List<String> answerOptions; 
    // etc. 
} 

查看

interface IFlashCardView 
{ 
    render(); 
} 

class MultipleOptionFlashCardView : IFlashCardView 
{ 
    public void render() 
    { 
     // show textbox for question 
     // show radio buttons for answer options 
    } 
} 
在呈现阶段

最后,

IFlashCard flashCard = getNextFlashCard(); 
IFlashCardView flashCardView = mapModelToView(flashCard); 
flashCardView.render(); 

,你的模型视图映射任意数量的方式,如:

IFlashCardView mapModelToView(IFlashCard card) 
{ 
    if (card is MultipleOptionFlashCard) 
    { 
     return new MultipleOptionFlashCardView(card); 
    } 
    else ... 
} 

如果您使用WPF,则可以定义DataTemplate以将模型类直接映射到一组控件,因此此过程变得更简单,并且DRYer更简单。

+0

你在说这种自定义视图引擎吗?这可以使用剃刀完成吗?在控制器中有类似if(nextCard是MultipleChoiceCard){return View(“MultipleChoiceView”,multipleChoiceModel)else ... //用于返回其视图的其他类型问题的代码。 – mageets