我有一个类的层次结构。每个班级在调查中代表不同类型的问题。
到目前为止,用户可以给出一个问题的答案(通过输入框,比率按钮或下拉菜单)。每个问题的答案都存储在answer
继承自Question
字段的字符串中。
我的任务是在层次结构中添加MultiChoice问题。多选问题使用户能够提供多个答案(例如通过在一组复选框中选择多个选项,或通过多个文本框)。
在下图中,绿色类是我需要添加的类。我的问题是目前的结构只是一个答案。
我考虑过两种可能的修改:
answer
字段中。list<String> answers
并向getAnswers()
添加getter MultiChoice
。我发现这两种方法都存在问题。第一个增加了向调用者解析可能的csv答案的责任。第二个违反了Liskov替代原则。
我的问题是:如何在不引入此类问题的情况下在MultiChoice
中支持多个答案?
答案 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);
...
}
使用每个具体答案类型的访问方法。然后,如果统计数据是您想要的,那么将每个答案的统计数据实现为访问者的实现。但是,请始终考虑您要对数据执行的操作,而不是在转储字段中。