在这种情况下接近多态的正确方法(JAVA)

时间:2011-11-24 01:17:26

标签: java

我已经完成了一个可以简化为这种情况的任务:

客户需要订购盒子,这些盒子可以有不同的尺寸,不同的尺寸可以以某种颜色(但不是所有颜色)订购,并且具有不同的质量(但不是所有品质)。

现在我认为解决这个问题的最佳方法是将box类设置为抽象类,并使用不同的框扩展box类以防止重复代码,但是问题就出现了,如何查看订单a客户端放入是有效的,而不在类中存储静态变量(此类不能有这种颜色等)?

我的解决方案是简单地将静态变量放在类的每个扩展中,然后在不初始化新对象的情况下检查每个类,但这意味着在每个类中都有重复的变量声明。

感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

除非您愿意拥有一个非常复杂的类层次结构,否则您可能需要考虑使用查找表而不是继承/多态。这肯定会更容易遵循和维护。

查找表的访问者可能类似于

Colors getColors(Size);
Colors getColors(Quality);
Qualities getQualities(Size);
Qualities getQualities(Color);


<强>更新

这里唯一可以使用OOP原则的方法是,如果您有足够的关于定义层次结构的关系的信息。

例如:

public abstract Shape {
  Color color;
  public setColor(Color c) { this.color = c}
  public abstract draw();
  ...
}
public Ellipse extends Shape ...
public Circle extends Ellipse ... /* this might be a stretch for mathemeticians */

如果您有关于该assignemnt的更多信息,请发布。

答案 1 :(得分:1)

我会使用一系列enums和一个抽象的Box类:

public static enum Color {
    RED, BLUE, GREEN, ETC
}

public static enum Quality {
    POOR, AVERAGE, GOOD, EXCELLENT
}

public static abstract class Box {
    private final EnumSet<Color> colors;
    private final EnumSet<Quality> qualities;
    private final String name;

    protected Box(String name, EnumSet<Color> colors, EnumSet<Quality> qualities) {
        this.name = name;
        this.colors = colors;
        this.qualities = qualities;
    }

    // getters/setters and methods for dealing with validating colors and qualities
}

public static class BoxType1 extends Box {
    public MyBox() {
        super("Type 1", EnumSet.of(Color.RED, Color.BLUE),
              EnumSet.of(Quality.AVERAGE, Quality.GOOD, Quality.EXCELLENT));
    }
}

答案 2 :(得分:0)

您不需要静态变量,因为您不需要所有对象共有的信息。你呢? 您的抽象类可以使用抽象方法validate(),并且派生类知道哪个是验证框,并且可以在其中包含实现。我希望它有意义,让我知道你是否还在寻找其他东西。

答案 3 :(得分:0)

如果没有关于任务场景的更多信息,很难提出建议。您应该提供有关客户端与订单和方框之间发生的交互类型的更多信息......

答案 4 :(得分:0)

我不确定你是否可以通过继承......

来解决这个问题

尽管如此,您可以使用工厂模式

你可以为盒子创建一个工厂,也可以说明哪些盒子是合法的结构,甚至可以给你一个合法的盒子列表供你选择......