我打算设计一个通用的提问类库,用户可以提出任何类型的问题(包括对该问题的回答)。下面是我实现的设计。谁能看一下,如果需要修改,请提出建议?
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.
}
}
请提供一个相同的通用设计。
这个本身其实没有什么问题,但是你应该考虑一下,你是否真的需要一个Interface的抽象类,或者你是否可以只用一个抽象类或者一个接口来代替。
如果你需要在其他地方使用IQuestion(例如客户端),或者将传递IQuestion的实现,而不是Question,那么这样做是有意义的。
如果您允许在未来灵活扩展,并在Interface级别上有不同的变化。
如果你只在一个单独的抽象类中使用它,你只会创建这个Question基类的子孙的具体实例,那么我建议你不要真的需要这个,你已经过度设计了。