Я пытаюсь найти аккуратное решение проблемы анкеты. Допустим, у меня есть класс Questionnaire
, который имеет коллекцию Answer
с, например,
public class Questionnaire
{
public virtual ISet<Answer> Answers {get;set;}
}
Ответы должны быть разных типов в зависимости от вопроса, например, дата рождения, отметка из десяти, почему вы думаете и т. д.
Моя первая мысль была примерно такой:
public class Question
{
public virtual QuestionType TypeOfQuestion {get;set;}
public virtual string PromptText {get;set;}
}
public class Answer
{
public virtual Question Question {get;set;}
}
public class DateTimeAnswer : Answer
{
public virtual DateTime Response {get;set;}
}
public class IntegerAnswer : Answer
{
public virtual int Response {get;set;}
}
// etc.
Очевидная проблема заключается в том, что из вопросника нет доступа к свойству Response
:
questionnaire.Answers[0].Response; // compile error
То же самое относится к интерфейсу. Было бы лучше использовать универсальный интерфейс, такой как:
public interface IAnswer<T>
{
public virtual Question Question {get;set;}
public virtual T Response {get;set;}
}
public class DateTimeAnswer : IAnswer<DateTime> {}
В этом случае проблема возникает в классе Questionnaire
, поскольку необходимо указать тип IAnswer:
public class Questionnaire
{
public virtual ISet<IAnswer<???>> Answers {get;set;}
}
Очевидно, я не хочу иметь много коллекций IAnswer, каждый с разными типами. Я мог бы использовать
ISet<IAnswer<dynamic>>
но тогда NHibernate не понравится.
Я понимаю, что где-то нужен компромисс, но я не уверен, какой из них самый красивый. Что бы вы сделали?