我正在嘗試找到問卷調查問題的整齊解決方案。讓我們說,我有一個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