Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 相同地对待不同的对象?迭代器?_C#_.net_Iterator_Polymorphism - Fatal编程技术网

C# 相同地对待不同的对象?迭代器?

C# 相同地对待不同的对象?迭代器?,c#,.net,iterator,polymorphism,C#,.net,Iterator,Polymorphism,对不起,如果以前有人问过类似的问题。我会尽量说得具体一些 我正在用c#编写一个测验/学习闪存卡应用程序。这将允许用户创建一些用于自我评估的学习卡。我希望用户能够创建不同类型的卡片,即只有一个问题和答案的卡片,说两者都是字符串,有一个问题,然后有多个答案选择,还有一个是缺少单词的短语。理想情况下,我希望稍后对此问题进行扩展,例如,我可能希望添加一个由图表或图像组成的问题,其中缺少的单词是需要提供的标签 单独设计这些东西可能是可行的。我陷入困境的地方是知道如何设计这样一种方式,用户可以尝试参加测试,

对不起,如果以前有人问过类似的问题。我会尽量说得具体一些

我正在用c#编写一个测验/学习闪存卡应用程序。这将允许用户创建一些用于自我评估的学习卡。我希望用户能够创建不同类型的卡片,即只有一个问题和答案的卡片,说两者都是字符串,有一个问题,然后有多个答案选择,还有一个是缺少单词的短语。理想情况下,我希望稍后对此问题进行扩展,例如,我可能希望添加一个由图表或图像组成的问题,其中缺少的单词是需要提供的标签

单独设计这些东西可能是可行的。我陷入困境的地方是知道如何设计这样一种方式,用户可以尝试参加测试,系统可以循环通过卡,这样用户看到的下一张卡是集合中的任意一张,可以是我在下面提到的任何一种类型。我可以定义某种公共接口,比如ICard,并遍历该类型的集合,但我是否总是必须知道我拥有的类型,以便向用户显示该特定卡所需的内容,例如,如果是多选类型的卡,则显示多选。这种设计似乎有点不对,但我不确定还有什么其他的方法可以采用


谢谢

对通用卡使用ICard,对每种类型的卡使用其他接口

class MyCard: IMyCard, ICard 
{ ... }
使用ICard循环并在到达渲染部分时使用

if(object is IMyCard)
    renderIMyCard();
确定您正在使用的特定类型的卡。严格地说,您并不需要为每种类型使用接口,但是如果您这样做,那么使用接口将使代码更容易进行单元测试


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

使用公共基本接口为每种类型的卡定义模型类。然后,定义相应的视图类,这些视图类处理这些模型类的渲染。下面是一个例子:

型号:

interface IFlashCard { ... }

class MultipleOptionFlashCard : IFlashCard
{
    String question;
    List<String> answerOptions;
    // etc.
}
最后在渲染阶段

IFlashCard flashCard = getNextFlashCard();
IFlashCardView flashCardView = mapModelToView(flashCard);
flashCardView.render();
可以通过多种方式将模型映射到视图,例如:

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

如果您使用的是WPF,则可以定义一个
DataTemplate
来直接将模型类映射到一组控件,这样这个过程就会变得更简单、更干练。

这在很大程度上取决于您使用的UI技术(WPF、ASP.NET、MVC等)。提供更多关于这方面的信息,以改进可能的答案。我将使用MVC。目前,我正在尝试定义一些核心类。我可以看到这个问题,所以我宁愿现在就解决它,或者至少知道如何解决。好的,谢谢。因此,如果我需要根据类型(例如图像、可能答案列表)呈现不同的内容,我似乎必须知道类型。我还希望能够检查用户为每个问题提供的答案。由于答案不同,因此提供的答案也会不同,例如单个字符串与列表。在ICard中使用bool CheckAnswer(object suppliedAnswer)然后让每种类型实现它们自己的版本是否可以接受?您在这里谈论的是某种自定义视图引擎吗?这可以用剃须刀吗?在控制器中,有类似if(nextCard是multipleechoicecard){return View(“multipleechoiceview”,multipleechoicemodel)else…//为其他类型的问题编写代码以返回其视图。
IFlashCardView mapModelToView(IFlashCard card)
{
    if (card is MultipleOptionFlashCard)
    {
        return new MultipleOptionFlashCardView(card);
    }
    else ...
}