2014-03-29 3 views
0

죄송합니다. 이전에 비슷한 질문이 있으면 부탁드립니다. 가능한 한 구체적으로 시도해 보겠습니다.다른 개체를 동일하게 취급합니까? 반복자?

저는 C#으로 퀴즈/스터디 플래시 카드 응용 프로그램을 만들고 있습니다. 그러면 사용자가 자체 평가를 위해 여러 장의 학습 카드를 만들 수 있습니다. 나는 사용자가 다른 유형의 카드를 만들 수있는 능력을 가지길 원한다. 즉, 단지 질문과 대답이있다. 둘 다 문자열로되어있다. 하나는 질문이 있고 그 다음에 여러 개의 대답이 있고, 하나는 이것이있는 곳이다. 단어가없는 문구. 이상적으로 나는 이것을 나중에 확장자로 남겨두고 싶습니다. 누락 된 단어가 제공되어야하는 레이블 인 다이어그램 또는 이미지로 구성된 질문을 추가 할 수 있습니다.

이러한 것들을 개별적으로 설계하는 것은 아마도 가능합니다. 내가 붙어있는 곳은 사용자가 테스트를 시도 할 수있는 방식으로 이것을 디자인하는 방법을 알고 있으며 시스템은 사용자가 제시된 다음 카드가 다음과 같은 방식으로 카드를 통해 반복 할 수 있습니다. 집합과 내가 아래 언급 한 유형 중 하나가 될 수 있습니다. ICard라고하는 일종의 공용 인터페이스를 정의하고 해당 유형의 콜렉션을 반복하지만 실제로 어떤 유형인지 알고 있어야만 사용자에게 특정 카드에 필요한 것을 표시 할 수 있습니다. 객관식 카드 유형 인 경우 여러 선택 사항을 표시하십시오. 그런 종류의 디자인에 관한 것이 옳지 않은 것처럼 보이지만 다른 접근법이 무엇인지 확신 할 수 없습니다.

감사

+0

이것은 사용중인 UI 기술 (WPF, ASP.NET, MVC 등)에 따라 크게 다릅니다. 가능한 대답을 향상시키기 위해 이것에 관한 좀 더 많은 정보를 제공하십시오. – Bas

+0

MVC를 사용하고 있습니다. 현재 정의 된 핵심 클래스를 얻으려고하고 있습니다. 내가 라인을 내려이 문제를 볼 수 있도록 노력하고 차라리 지금 해결하려고하거나 적어도 어떻게 생각을 가지고. – mageets

답변

0

를 사용하여 일반 카드 ICard 및 카드의 각 유형에 대한 몇 가지 다른 인터페이스를 제공합니다. ICard을 사용하고 렌더링 부분 사용에 도착하면

if(object is IMyCard) 
    renderIMyCard(); 

가 작업중인 카드의 특정 유형을 확인하려면 통해

class MyCard: IMyCard, ICard 
{ ... } 

루프. 엄밀히 말하자면 각 유형마다 인터페이스를 사용할 필요는 없지만 인터페이스를 사용하면 코드를 단위 테스트에 쉽게 적용 할 수 있습니다.

다른 방법으로는 ICard에 유형을 enum 속성으로 삽입하는 것입니다. 그러나 나는 인터페이스 방식이 장기적으로 당신에게 더 잘 도움이 될 것이라고 생각합니다.

+0

감사합니다. 그래서 타입에 따라 다른 것을 렌더링해야한다면 타입을 알아야 할 것 같습니다. 이미지, 가능한 답의 목록. 또한 각 질문에 대해 사용자가 제공 한 답변을 확인하는 기능이 필요합니다. 서로 다르므로 제공되는 답변은 다를 수 있습니다. 단일 문자열 대 List . ICard에서 bool CheckAnswer (objects 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)와 같은 것이 있습니다. {View ("MultipleChoiceView", multipleChoiceModel) else ... // 다른 유형의 질문이보기를 반환하도록 코드합니다. – mageets

관련 문제