我正在帮助开发的程序应该输出几个动态生成的问题供用户回答。这些问题有不同的类型,并有一个相应的类Constraint
,它们用用户给定的信息填充。我的问题是如何为不同的约束创建统一的行为。
---->Constraint<--------------------
| | |
FConstraint PConstraint TConstraint
| |
UConstraint AConstraint
基类Constraint
是空的,TConstraint 也是如此。
UConstraint
,PConstraint
并AConstraint
共享三个变量。但是,UConstraint
还有AConstraint
一个PConstraint
没有的附加变量。
我觉得我正试图用一些钳子锤穿一堵砖墙。我的一个想法是为带有签名的约束提供一种抽象方法:
// All answers are of type string.
abstract void setValue(string variable, string answer);
每个Constraint
子类都实现了这些。但是,传递一个字符串来确定要设置哪个变量似乎很容易出错,而且代码味道也很糟糕。
第二个选项是将三个相似的变量向上移动到约束中,但这仍然留下UConstraint, AConstraint
了我可能需要设置的额外信息。TConstraint
不需要任何这些都无济于事。
我目前的蛮力“搞砸了这个设计”。解决方案是一个instanceof
汤,我在其中检查并填写缺少的特定于约束的信息。
Object constraint = item.getConstraint();
if (constraint instanceof AConstraint) {
AConstraint constraint = (AConstraint) constraint;
if (constraint.getValue() == null) {
constraint.setValue(string);
} else if (constraint.getKey() == null) {
constraint.setKey(string);
} // More of the same.
} else if (constraint instanceof PConstraint) {
// As the above if() group.
} // etc.
这个设计有比抽象函数更好的解决方案吗?