我正在帮助开发的程序应该输出几个动态生成的问题供用户回答。这些问题有不同的类型,并有一个相应的类 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
子类实现。然而,传递一个字符串来确定要设置哪个变量似乎容易出错,并且有类似的糟糕代码味道。
第二个选项是将三个相似的变量向上移动到 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.
这种设计有没有比抽象函数更好的解决方案?
最佳答案
你的问题没有足够的信息来说明你在每种情况下需要做的实际工作,但通常是这样的代码:
Object constraint = item.getConstraint();
if (constraint instanceof AConstraint) {
// Work
} else if (constraint instanceof PConstraint) {
// Work
} // etc.
使用起来味道很重polymorphism并重构为这样的东西:
Constraint constraint = item.getConstraint();
constraint.doWork(...);
具体类看起来像这样:
public class AConstraint {
public ... doWork(...) {
if (getValue() == null) {
setValue(string);
} else if (getKey() == null) {
setKey(string);
} // More of the same.
}
}
关于java - 如何整合多个类,避免instanceof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725540/