在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 CorrectOptionstring[] Options & string[] CorrectOptions ?我已经尝试了一段时间了,我很困惑是否有任何面向对象的概念可以用来实现这一目标。任何帮助都会非常感激。谢谢!

在c#中,是否可以基于构造函数中传递的Enum值来创建类的对象?

对,这叫做工厂方法。这是一种非常常见的设计模式。我假设您不需要一些示例代码,因为它非常简单。看来你只是想证实你的方法。

是:

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
}