2016-12-01 8 views
0

私のコードでは、ユーザーは質問と回答のペアを作成できます。答えには、NumericalAnswer、RangedAnswer、またはShortAnswer(文字列)の3つのタイプがあります。3つの定義済みオブジェクトの1つになる変数を持つ方法

class QuestionClass 
{ 
    private string question; 
    private AnswerClass answer; 

    public string Question 
    { 
     get { return question; } 
     set { question = value; } 
    } 

    public AnswerClass Answer 
    { 
     get { return answer; } 
     set { answer = value; } 
    } 

    public QuestionClass(string question, AnswerClass answer) 
    { 
     this.question = question; 
     this.answer = answer; 
    } 
} 

すべての回答タイプは、空の基本クラスAnswerClassから継承されます。

は、私は基本質問クラスを持っています。回答のクラスは次のとおりです。

class NumericalAnswer : AnswerClass 
{ 
    private float answer; 

    public float Answer 
    { 
     get { return answer; } 
     set { answer = value; } 
    } 
} 

class RangedAnswer : AnswerClass 
{ 
    private float lowerBound; 
    private float upperBound; 

    public float LowerBound 
    { 
     get { return lowerBound; } 
     set { lowerBound = value; } 
    } 

    public float UpperBound 
    { 
     get { return upperBound; } 
     set { upperBound = value; } 
    } 
} 

class ShortAnswer : AnswerClass 
{ 
    private string[] answer; 

    public string[] Answer 
    { 
     get { return answer; } 
     set { answer = value; } 
    } 
} 

しかし、例えば、私はRangedAnswerで質問を作成し、私はできません下界の変数にアクセスしようとした場合。どのように複数のAnswerクラスを持つことができるのか分かっているなら。

答えて

0

あなたはジェネリック医薬品を使用することができます。

public class QuestionClass<T> where T : AnswerClass 
{ 
    private string question; 
    private T answer; 

    public string Question 
    { 
     get { return question; } 
     set { question = value; } 
    } 

    public T Answer 
    { 
     get { return answer; } 
     set { answer = value; } 
    } 

    public QuestionClass(string question, T answer) 
    { 
     this.question = question; 
     this.answer = answer; 
    } 
} 

使用例:複数の質問タイプを保持しているリストの作成をサポートするために

var ra = new RangedAnswer(); 
ra.LowerBound = 10; 
ra.UpperBound = 20; 
var q = new QuestionClass<RangedAnswer>("Test range?", ra); 
q.Answer.LowerBound.Dump(); 

EDIT ..この作品のような

しまう何かを?

public abstract class QuestionClass { 

    } 

    public class QuestionClass<T> : QuestionClass where T: AnswerClass 
    { 
     private string question; 
     private T answer; 

     public string Question 
     { 
      get { return question; } 
      set { question = value; } 
     } 

     public T Answer 
     { 
      get { return answer; } 
      set { answer = value; } 
     } 

     public QuestionClass(string question, T answer) 
     { 
      this.question = question; 
      this.answer = answer; 
     } 
    } 

And usage like this: 

void Main() 
{ 
    var ra = new RangedAnswer(); 
    ra.LowerBound = 10; 
    ra.UpperBound = 20; 

    var na = new NumericalAnswer(); 
    na.Answer = 25; 

    var q1 = new QuestionClass<RangedAnswer>("Test range?", ra); 
    var q2 = new QuestionClass<NumericalAnswer>("Numberic?", na); 

    var list = new List<QuestionClass>(); 
    list.Add(q1); 
    list.Add(q2); 

    foreach (var q in list) 
    { 
     var rat = q as QuestionClass<RangedAnswer>; 
     if (rat != null) { 
      rat.Answer.LowerBound.Dump(); 
     } 
     var nat = q as QuestionClass<NumericalAnswer>; 
     if (nat != null) { 
      nat.Answer.Answer.Dump();   
     } 
    } 
} 
+0

これで唯一の問題は、私が作ることができない今、次のとおりです。 一覧すべての3つの回答タイプの Iができますか? – cookies

+0

@cookies複数の質問タイプのリストを作成するためのサポートをいくつか変更して自分の答えを編集しました –

+0

これはまさに私がやろうとしていたことです - ありがとう:)私はインターフェースを使ってみましたが、 – cookies

関連する問題