我的代码使用户可以创建问答对。答案可以是三种类型:一个数值,rangedanswer或shortanswer(字符串)。
我有基本问题类:
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创建一个问题,并尝试访问我无法访问的下部变量。如果您知道我将如何能够有多个答案类。
您可以使用通用:
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();
}
}
}