在c#中,是否可以基于构造函数中传递的Enum值来创建类的对象?
本文关键字:Enum 对象 创建 构造函数 是否 | 更新日期: 2023-09-27 18:04:12
我正在创建一个小项目,用户可以创建包含多项选择题的测试。这些mcq可以有一个或多个正确答案。我定义的类如下:
public class MultipleChoiceQuestionSingle : Question
{
public string[] Options { get; set; }
public int CorrectOption { get; set; }
}
public class MultipleChoiceQuestionMultiple : Question
{
public string[] Options { get; set; }
public int[] CorrectOptions { get; set; }
}
我要做的是为MultipleChoiceQuestion
设置一个构造函数
public MultipleChoiceQuestion(McqType mcqType)
{
}
public enum McqType
{
SingleAnswer = 0,
MultipleAnswers = 1
}
是否可以根据初始化对象时选择的Enum值,分别为单个答案或多个答案创建MultipleChoiceQuestion
实例,其属性分别为string[] Options & string CorrectOption
或string[] Options & string[] CorrectOptions
?我已经尝试了一段时间了,我很困惑是否有任何面向对象的概念可以用来实现这一目标。任何帮助都会非常感激。谢谢!
对,这叫做工厂方法。这是一种非常常见的设计模式。我假设您不需要一些示例代码,因为它非常简单。看来你只是想证实你的方法。
是:
public MultipleChoiceQuestion(McqType mcqType)
{
Question q;
switch (mcqType) {
case SingleAnswer:
q = new MultipleChoiceQuestionSingle();
break;
case MultipleAnswers:
q = new MultipleChoiceQuestionMultiple();
break;
}
}
冒着线程脱轨的风险,我需要指出一些事情。你所有的问题都有n个正确答案。对于某些问题,n等于1,而对于其他问题,则大于1。我认为你不需要两个类和一个完整的case语句来模拟这个事实。
只使用一个Question
类,并且有些问题只有一个正确答案。
同样,与其有一个答案数组,然后有一个正确答案索引的单独数组,不如把正确性作为答案的一个属性。你会得到这样的结果:
class Answer
{
public string Text { get; set; }
public bool Correct { get; set; }
}
class Question
{
public string QuestionText { get; set; }
public List<Answer> Answers { get; set; }
}
void Main()
{
var test = new List<Question>
{
new Question
{
QuestionText = "What colour is the sky?",
Answers = new List<Answer>
{
new Answer { Text = "Blue", Correct = true },
new Answer { Text = "Red", Correct = false },
new Answer { Text = "Green", Correct = false }
}
},
new Question
{
QuestionText = "Which animals can swim?",
Answers = new List<Answer>
{
new Answer { Text = "Ducks", Correct = true },
new Answer { Text = "Fish", Correct = true },
new Answer { Text = "Horses", Correct = false }
}
}
};
// do stuff with the test
}