如何拥有可能是三个预定义对象之一的变量



我的代码使用户可以创建问答对。答案可以是三种类型:一个数值,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();           
        }
    }
}

最新更新