Java 在设计用于保存单个字符串的类层次结构中存储多个字符串

Java 在设计用于保存单个字符串的类层次结构中存储多个字符串,java,Java,我有一个类的层次结构。在调查中,每门课代表不同类型的问题 到目前为止,用户可以对一个问题给出单一答案(通过输入框、比率按钮或下拉列表)。每个问题的答案作为字符串存储在继承自问题的答案字段中 我的任务是在层次结构中添加一个多选问题。多选项问题使用户能够提供多个答案(例如通过在一组复选框中选择多个选项,或通过多个文本框) 在下图中,我需要添加green类。我的问题是,目前的结构只假设一个答案 我想到了两种可能的修改: 将多个答案编码为csv,并将其存储在answer字段中 引入一个新字段列出答案,

我有一个类的层次结构。在调查中,每门课代表不同类型的问题

到目前为止,用户可以对一个问题给出单一答案(通过输入框、比率按钮或下拉列表)。每个问题的答案作为字符串存储在继承自
问题
答案
字段中

我的任务是在层次结构中添加一个多选问题。多选项问题使用户能够提供多个答案(例如通过在一组复选框中选择多个选项,或通过多个文本框)

在下图中,我需要添加green类。我的问题是,目前的结构只假设一个答案

我想到了两种可能的修改:

  • 将多个答案编码为csv,并将其存储在
    answer
    字段中
  • 引入一个新字段
    列出答案
    ,并将一个getter
    getAnswers()
    添加到
    MultiChoice
我认为这两种方法都有问题。第一种方法增加了解析调用方可能的csv答案的责任。第二个违反了利斯科夫替代原则

我的问题是:如何在
MultiChoice
中支持多个答案而不引入此类问题


简单的答案当然是将界面更改为

List<String> getAnswers();
void addAnswer(String answer);
还有一个vistor界面,比如

void accept(Visitor v);
interface Visitor<T> {
  T visit(T arg, DropDown answer);
  T visit(T arg, MultiChoice answer);
  T visit(T arg, SingleChoice answer);
  ...
}
界面访问者{
T访问(T参数,下拉回答);
T访视(T参数,多选回答);
T访视(T参数,单选答案);
...
}

根据具体答案类型使用访问方法。然后将答案上的每个统计信息作为访问者的实现来实现,如果统计信息是您想要做的。但是,请始终考虑如何处理数据,而不是转储字段。

为了澄清,一个问题应该能够接受同一问题的多个答案?或者,它就像一个多选题,实际上从一系列可能的答案中只选择了一个答案?格式是否为“选择所有适用项”或“选择正确选项”如何打破Liskov替换原则!将
Multi-choice
移动到单独的层次结构中,并更新客户端代码,这样它将知道如何处理
Single-
Multi-
类型的问题/答案?同一问题的多个答案。想象一下被要求标记一个或多个指示您答案的复选框。@neerajain
setAnswer
getAnswer
需要在MultiChoice中禁用(未实现异常?)。这会导致违反LSP。谢谢。我决定向列表返回一个迭代器。