处理不同的物体是一样的吗?迭代器?

时间:2014-03-29 20:37:23

标签: c# .net iterator polymorphism

很抱歉,之前有过类似的问题。我会尝试尽可能具体。

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

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

由于

2 个答案:

答案 0 :(得分:0)

将ICard用于普通卡以及每种类型卡的其他接口。

class MyCard: IMyCard, ICard 
{ ... }

使用ICard循环,当你到达渲染部分时使用

if(object is IMyCard)
    renderIMyCard();

确定您使用的是哪种特定类型的卡片。严格来说,您并不需要为每种类型使用接口,但是如果您使用接口,则可以使代码更容易进行单元测试。

另一种方法是将IC卡中的卡类型作为枚举属性嵌入。但我认为界面方法从长远来看会更好。

答案 1 :(得分: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以将模型类直接映射到一组控件,因此此过程变得更简单且更干燥。