我正在尝试找到问卷调查问题的整齐解决方案。让我们说,我有一个Questionnaire
类,它有一个集合Answer
,例如在NHibernate中提供不同类型的问题的答案
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
property:
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不会喜欢它。
我意识到需要妥协某处,但我不确定哪个是最漂亮的。你会怎么做?
我同意一般结构,但我认为你已经暴露了将IAnswer作为泛型类的问题。 在您的示例DateTimeAnswer不是答案,因此无法进入AnswersCollection。你必须让它继承自Answer,并且实现Response属性的对象版本以及你的强类型对象。 从问题你只会遍历答案强类型DateTime响应似乎是一种浪费。 – spmason 2010-07-13 08:25:46
它确实有帮助,谢谢。我会考虑一下并尝试一下。 – harriyott 2010-07-13 08:28:37
啊,史蒂夫 - 好点,答案应该子类答案和实现接口。我会纠正的。强大的打字更多的是为了创作的和平,你不能创建“对象”版本,因为它是抽象的。这是一个经典的问题,“想要强大的打字,但实际上只有*真的需要它10%的时间“.. – 2010-07-13 08:42:02