我正在帮助开发的程序应该输出几个动态生成的问题供用户回答。这些问题有不同的类型,并且有一个相应的类 Constraint,它们用用户提供的信息填充。我的问题是如何为不同的约束创建统一的行为。

                    ---->Constraint<--------------------
                    |                  |               |
                  FConstraint        PConstraint    TConstraint
                  |         |
            UConstraint AConstraint

基类 Constraint 是空的,TConstraint 也是空的。
UConstraintPConstraintAConstraint 共享三个变量。然而,UConstraintAConstraint 有一个 PConstraint 没有的额外变量。

我觉得我正试图用一些钳子敲打砖墙。我的一个想法是为 Constraint 提供一种抽象方法,带有签名:
// 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.

这种设计有比抽象函数更好的解决方案吗?

最佳答案

您的问题没有关于您在每种情况下需要做的实际工作的足够信息,但通常是这样的代码:

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.
  }
}

10-06 02:16