【问题标题】:Treating different objects the same? Iterator?对待不同的对象是一样的?迭代器?
【发布时间】:2014-03-29 20:37:22
【问题描述】:

抱歉,如果以前有人问过类似的问题。我会尽量具体一点。

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

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

谢谢

【问题讨论】:

  • 这高度依赖于您使用的 UI 技术(WPF、ASP.NET、MVC 等)。提供更多相关信息以改进可能的答案。
  • 我将使用 MVC。目前我只是想定义一些核心类。我可以看到这个问题,所以我宁愿现在尝试解决它,或者至少知道如何解决。

标签: c# .net iterator polymorphism


【解决方案1】:

通用卡使用ICard,各类卡使用其他接口。

class MyCard: IMyCard, ICard 
{ ... }

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

if(object is IMyCard)
    renderIMyCard();

确定您正在使用哪种特定类型的卡。严格来说,你并不真的需要为每种类型都使用一个接口,但是如果你这样做的话,使用一个接口会让代码更容易进行单元测试。

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

【讨论】:

  • 好的,谢谢。所以看起来如果我需要根据类型渲染不同的东西,我必须知道类型,例如一张图片,一个可能的答案列表。我还希望能够检查用户为每个问题提供的答案。由于它们不同,因此提供的答案也会不同,例如单个字符串与 List。在 ICard 中使用 bool CheckAnswer(object providedAnswer) 然后让每种类型实现自己的版本是否可以接受?
【解决方案2】:

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

型号:

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了。

【讨论】:

  • 您是在说某种自定义视图引擎吗?这可以用剃须刀完成吗?在控制器中有类似 if (nextCard is MultipleChoiceCard) { return View("MultipleChoiceView", multipleChoiceModel) else ... //其他类型问题的代码以返回其视图。
猜你喜欢
  • 2017-09-30
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2021-10-27
相关资源
最近更新 更多