从父类型实例化子项

时间:2009-10-09 23:57:39

标签: c# inheritance

我有一个基本类型,用于在系统的问题池中存储有关问题的信息,该系统生成练习题集以帮助人们学习多项选择题。存储在其中的唯一信息是答案,提示和问题编号。当我创建练习测试时,我需要使用一些属性来扩充类型以存储提交的答案(测试可以部分进行),因此我创建了以下类:

public class MultipleChoiceQuestion
{
    public Int32 Number { get; internal set; }
    public String Prompt { get; internal set; }
    public MultipleChoiceAnswer[] Choices { get; internal set; }

    // constructors, etc...
}

public class PracticeTestQuestion : MultipleChoiceQuestion
{
    public MultipleChoiceAnswer AnswerSelected { get; set; }

    // is this right?
    public PracticeTestQuestion(MultipleChoiceQuestion question)
    {
        ...
    }
}

最初我将MultipleChoiceQuestion作为PracticeTestQuestion的成员,但它在我的属性访问器中添加了许多额外的点,因此我将其更改为继承上面列出的类。目前我在构造函数中为行指定了所有属性行,但感觉有点麻烦,我想知道是否有更好的方法。

C#编译器不喜欢升级类型的原因,所以我的问题是从MultipleChoiceQuestion基类型中实例化我的PracticeTestQuestions的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我会向MultipleChoiceQuestion添加另一个MultipleChoiceQuestion的构造函数。如果有必要,它可以在构造函数中分配每个属性,但这更合适,因为它具有自己的属性。

然后在PracticeTestQuestion,您可以这样做:

public PracticeTestQuestion(MultipleChoiceQuestion question) : base(question) { }

并完成它。

答案 1 :(得分:0)

我的第一个直觉反应是使用工厂来创造问题。您向工厂询问MCQ或PTQ,并创建正确的。

这对论文问题也更具扩展性,真假等等。