создание экземпляра дочернего объекта родительского типа - PullRequest
0 голосов
/ 10 октября 2009

У меня есть базовый тип, который хранит информацию о вопросе в пуле вопросов для системы, которая генерирует практические наборы вопросов, чтобы помочь людям учиться для тестов с несколькими вариантами ответов. Единственная информация, которая хранится в нем - это ответы, подсказка и номер вопроса. Когда я создаю тренировочный тест, мне нужно дополнить тип некоторыми свойствами, чтобы сохранить отправленный ответ (тест можно пройти по частям), поэтому я создал следующие классы:

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 # не нравится увеличивать размеры по уважительным причинам, поэтому мой вопрос: каков наилучший способ создания экземпляров моих PracticeTestQuestions из их базовых типов MultipleChoiceQuestion?

Ответы [ 2 ]

2 голосов
/ 10 октября 2009

Я бы добавил конструктор к MultipleChoiceQuestion, который принимает еще MultipleChoiceQuestion. При необходимости он может назначить каждое из свойств в конструкторе, но это более уместно, поскольку он знает свои собственные свойства.

Тогда в PracticeTestQuestion вы можете просто сделать:

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

и покончим с этим.

0 голосов
/ 10 октября 2009

Моя первая внутренняя реакция - использовать фабрику для создания вопросов. Вы спрашиваете у изготовителя MCQ или PTQ, и он создает правильный.

Это также более расширяемо для вопросов эссе, истинных ложных и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...