在类层次结构中存储多个字符串,用于保存单个字符串

时间:2015-03-16 18:55:16

标签: java

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

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

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

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

我考虑过两种可能的修改:

  • 将多个答案编码为csv并将其存储在answer字段中。
  • 引入新字段list<String> answers并向getAnswers()添加getter MultiChoice

我发现这两种方法都存在问题。第一个增加了向调用者解析可能的csv答案的责任。第二个违反了Liskov替代原则。

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

List<String> getAnswers();
void addAnswer(String answer);

但这仍然是结构而不是面向对象的设计。对我来说,这就像一个访客模式的情况,只有一个像

这样的界面
void accept(Visitor v);

和像

这样的vistor接口
interface Visitor<T> {
  T visit(T arg, DropDown answer);
  T visit(T arg, MultiChoice answer);
  T visit(T arg, SingleChoice answer);
  ...
}

使用每个具体答案类型的访问方法。然后,如果统计数据是您想要的,那么将每个答案的统计数据实现为访问者的实现。但是,请始终考虑您要对数据执行的操作,而不是在转储字段中。