Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在这种情况下处理多态性的正确方法(JAVA)_Java - Fatal编程技术网

在这种情况下处理多态性的正确方法(JAVA)

在这种情况下处理多态性的正确方法(JAVA),java,Java,我被赋予了一项可以简化为这种情况的任务: 客户需要订购箱子,这些箱子可以有不同的尺寸,不同的尺寸可以订购特定的颜色(但不是所有的颜色),并且具有不同的质量(但不是所有的质量) 现在,我认为最好的方法是将box类作为抽象类,并让不同的box扩展box类以防止重复代码,但问题是,如何在不将静态变量存储在类中的情况下检查客户输入的订单是否有效(此类不能有这种颜色等) 我的解决方案是简单地在类的每个扩展中放置静态变量,然后检查每个类,而不初始化新对象,但这意味着在每个类中都有重复的变量声明 有任何帮助。

我被赋予了一项可以简化为这种情况的任务:

客户需要订购箱子,这些箱子可以有不同的尺寸,不同的尺寸可以订购特定的颜色(但不是所有的颜色),并且具有不同的质量(但不是所有的质量)

现在,我认为最好的方法是将box类作为抽象类,并让不同的box扩展box类以防止重复代码,但问题是,如何在不将静态变量存储在类中的情况下检查客户输入的订单是否有效(此类不能有这种颜色等)

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


有任何帮助。

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

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

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的更多信息,请发布。

您不需要静态变量,因为您不需要所有对象的公共信息。你…吗?
抽象类可以有抽象方法validate(),派生类知道哪个是validate框,并且可以在其中有一个实现。我希望这是有意义的,如果您还需要其他东西,请告诉我。

我将使用一系列
枚举和一个抽象框类:

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));
    }
}
公共静态枚举颜色{
红色、蓝色、绿色等
}
公共静态枚举质量{
差的,一般的,好的,极好的
}
公共静态抽象类框{
私有最终枚举集颜色;
私人最终用户集质量;
私有最终字符串名;
受保护的框(字符串名称、枚举集颜色、枚举集质量){
this.name=名称;
这个。颜色=颜色;
这个。质量=质量;
}
//用于验证颜色和质量的getter/setter和方法
}
公共静态类BoxType1扩展了Box{
公共邮箱(){
超级(“类型1”,枚举集(颜色.红色,颜色.蓝色),
(质量、平均、质量、良好、质量、优秀)的枚举集;
}
}

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

我不确定您是否应该通过子类化来解决这个问题

尽管如此,您仍然可以使用factory模式进行此操作


您可以为方框创建一个工厂,该工厂还可以提供关于哪些方框是合法构造的声明,甚至可以提供一个合法方框列表,供您从中选择……

“颜色”和“质量”类似于方框的属性(即成员变量),而不是方框的子类型。因此,您可能不希望使用多态性。是的,但我不希望将决策硬编码到订单流程中,如果我扩展它们,我可以查看新类,看看订单是否符合任何框要求,或者我是否过度复杂化了它?您有任务吗?还是给你布置了家庭作业?@JamieB:我不完全理解你的想法。但是我认为你不想把
BigRedBox
bigreenbox
SmallRedBox
SmallGreenBox
,等等作为一个不同的子类。家庭作业听起来很简单:)是的,对于各种类型的盒子(不是颜色,也可能不是大小,而是鞋盒和雪茄盒等),仍然可以有“盒子”的子类,但是将属性放入一个表中。不要过于复杂。这项任务围绕着整个多态性问题,所以我需要这样做,我只是在寻找最有效的方法。如果这是一个家庭作业,我认为这不是一个很好的方法。它代表了真实世界,但这不是一个好的多态性练习。好的,基本上每个盒子等级(我们必须最终确定盒子等级)首先有一个最小和最大厚度(1-5),接下来每个等级只能有特定的颜色,然后还有一些其他的品质,比如层压和强化,这些品质将根据输入的数据决定它的等级。我们得到了low mark方法,这是我试图避免的方法“有一个最终的if语句选择‘如果厚度>0且颜色为红色,则必须为1级’”。问题是,要使用抽象方法,必须实例化类。在实例化类之前,您想知道什么是“合法的”。不确定我们是否在同一页上,我需要在提交订单后进行检查,小程序应该能够首先快速确定订单是否符合任何框,然后当然选择它,初始化该框的一个对象并从该对象运行一个方法。感谢我了解枚举等,我对C#更为熟悉。这不是我们班目前的水平,所以我无法做到这一点,因为我在第二周交了一些使用try/catch的东西,所以我丢了分数,因为我使用了我们没有涉及到的东西:)我认为我不同意这一点。你必须为每个新属性添加更多枚举,并为每个BoxType添加一个新的Box扩展。它没有那么复杂,没有客户端,没有订单,基本上应用程序所要做的就是它需要显示多态性,它在这里说“显示抽象类的使用”。小程序所要做的就是验证输入是否正确(字母而不是数字),然后找出数据匹配的框并执行