J'essaie de trouver une solution propre à un problème de questionnaire. Disons que j'ai une classe Questionnaire
qui a une collection de Answer
s, par ex.Questions avec différents types de réponses dans NHibernate
public class Questionnaire
{
public virtual ISet<Answer> Answers {get;set;}
}
Les réponses doivent être de différents types en fonction de la question, par ex. date de naissance, marques sur dix, pourquoi pensez-vous, etc.
Ma première pensée était quelque chose comme ceci:
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.
Le problème évident serait que du questionnaire, il n'y a pas accès à la Response
propriété:
questionnaire.Answers[0].Response; // compile error
serait de même à une interface. Il serait plus agréable d'utiliser une interface générique, par exemple:
public interface IAnswer<T>
{
public virtual Question Question {get;set;}
public virtual T Response {get;set;}
}
public class DateTimeAnswer : IAnswer<DateTime> {}
Le problème vient alors dans la classe Questionnaire
, comme le type de IAnswer doit fournir:
public class Questionnaire
{
public virtual ISet<IAnswer<???>> Answers {get;set;}
}
Il est clair que je ne vouloir avoir de nombreuses collections de IAnswer chacun avec différents types. Je pourrais utiliser
ISet<IAnswer<dynamic>>
mais NHibernate ne l'aimerait pas. Je réalise qu'un compromis est nécessaire quelque part, mais je ne suis pas sûr de savoir lequel est le plus joli. Qu'est-ce que tu ferais?
Je suis d'accord sur la structure générale, mais je pense que vous avez exposé un problème avec IAnswer en tant que classe générique. Dans votre exemple, DateTimeAnswer n'est pas une réponse et ne peut donc pas aller dans un AnswersCollection. Vous devrez également hériter de Answer, et implémenter la version de l'objet de la propriété Response ainsi que votre version fortement typée. A partir de la question, vous ne répéteriez jamais les réponses que la réponse DateTime fortement typée semble être une perte. – spmason
Cela aide, merci. Je vais y réfléchir et l'essayer. – harriyott
Ah, Steve - bon endroit, la réponse devrait sous-classe Répondre et implémenter l'interface. Je vais corriger. La typage fort est plus pour la tranquillité d'esprit sur la création, vous ne pouvez pas créer la version "objet" car elle est abstraite .. C'est le problème classique de "aimer le typage fort, mais en fait seulement * vraiment * en avoir besoin 10% du temps ".. –