2014-03-29 64 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