【问题标题】:Generic class design for asking any type of questions with answers?用于提出任何类型问题的通用类设计?
【发布时间】:2023-03-08 19:51:01
【问题描述】:

我打算为问题设计一个通用类库,用户可以在其中提出任何类型的问题(包括对该问题的答案)。
下面是我实现的设计。
如果需要,有人可以看看并建议任何更改吗?

public interface IQuestion
{
    void AskQuestion();
}

public abstract class Question:IQuestion
{
    public string QuestionString { get; set; }

    public Question()
    {
        QuestionString = string.Empty;
    }

    public Question(string QuestionString)
    {
        this.QuestionString = QuestionString;
    }

    public abstract void AskQuestion();
}

public class ChoiceQuestion: Question
{
    public List<string> ChoiceList { get; set; }

    public ChoiceQuestion(string QuestionString, List<string> Choices) 
        :base(QuestionString)
    {
        ChoiceList = Choices;
    }

    public override void AskQuestion()
    {
        Console.WriteLine(QuestionString);
        foreach(string opt in ChoiceList)
        {
            Console.Write(opt + "\t");
        }
        Console.WriteLine("\n=======================================================");
    }
}

public class MultipleChoiceQuestion : ChoiceQuestion
{
    public List<string> CorrectChoices { get; set; }

    public MultipleChoiceQuestion(string QuestionString, List<string> Choices, List<string> CorrectList) 
        : base(QuestionString, Choices) 
    {
        CorrectChoices = CorrectList;
    }
}

public class OptionalChoiceQuestion : ChoiceQuestion
{
    public string Answer;

    public OptionalChoiceQuestion(string QuestionString, List<string> Choices, string CorrectChoice)
        : base(QuestionString, Choices)
    {
        Answer = CorrectChoice;
    }
}



class Program
{
    static void Main(string[] args)
    {
        Question q = new OptionalChoiceQuestion("How many rings are on the Olympic flag?", new List<string> { "None","4","5","7"}, "5");
        q.AskQuestion(); // Output to console.

        q = new MultipleChoiceQuestion("Which of these are wild animals?", new List<string> { "Tiger", "Dog", "Cat", "Elephant", "Horse" }, new List<string> { "Tiger" , "Elephant" });
        q.AskQuestion(); // Output to console.
    }
}

请提供相同的通用设计。

【问题讨论】:

  • 这个有什么问题?
  • 我想知道我实现的设计是不是通用的,意味着它是否能满足世界上各种各样的问题,即问一个基本问题到多项选择水平。谢谢。
  • 我觉得这个问题更适合codereview.stackexchange
  • 我投票结束这个问题,因为它属于codereview.stackexchange.com
  • 抱歉,我真的不知道还有专门为解决此类查询而创建的网站。

标签: c# polymorphism multiple-inheritance


【解决方案1】:

这本身并没有什么问题,但是您应该考虑是否真的需要接口的抽象类,或者您是否可以只拥有一个抽象类或单个接口。

如果您需要在其他位置(例如客户端)使用 IQuestion,或者将传递 IQuestion 的实现而不是 Question,那么这样做是有意义的。

如果您允许将来灵活扩展以及接口级别的不同变化。

如果您只在单个抽象类中使用它,那么您将只创建此 Question 基类的后代的具体实例,那么我建议您实际上并不需要它并且您有过度设计。

【讨论】:

  • 谢谢杰森。我完全同意你的观点,但我在这里真正想要实现的是实现一个通用库,这样我就不需要依赖为每个不同的问题实现一个 concreate 类(谁知道)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多