根据用户输入决定构造函数调用

时间:2015-12-29 22:10:53

标签: java oop inheritance

我需要询问用户他想要绘制的图有多少边,然后调用正确的构造函数来实例化对象。

下面是我尝试使用IF语句解决答案(或者我可以使用开关),但我不知道这是否是最好的方法,可能是Java继承和多态。

所有类都扩展了类图。

课程图

IMAGE

MAIN CLASS:

    <defs>
       <pattern id="pattern" width="1600" height="800" patternUnits="userSpaceOnUse">
          <image xlink:href="http://lorempixel.com/1600/800/nature" width="1600" height="800" />
       </pattern>
    </defs>

    #container svg {
        stroke:url(#pattern);
    }

课程代码:

      --------------- Figure ---------------
      ^         ^             ^            ^
      |         |             |            |
      |         |             |            |
   Circle    Triangle      Rectangle     Exagone

6 个答案:

答案 0 :(得分:10)

工厂方法

您是否考虑过Factory Method Pattern?基本上,你有一个像这样的方法:

public Figure createInstance(int numSides) {
    Figure figure = null;

    switch(numSides) {
    case 0:
        figure = new Circle();
        break;
    case 3:
        // etc...
        // Make a case for each valid number of sides
        // Don't forget to put a "break;" after each case!
    default:
        // Not a valid shape; print your error message
    }
    return figure;
}

让工厂方法做出决定。

答案 1 :(得分:4)

这是何时使用factory design method的一个很好的例子。标准是有一个工厂类,它确定要调用的构造函数,然后返回该对象。就个人而言,我倾向于把它推到基类的静态方法中(随意评论为什么这可能是坏的)。

答案 2 :(得分:4)

解决此问题的一种方法是将一个工厂方法添加到Figure类中以构建其他数字。这会将代码保存在一个地方,并且可以很容易地用于图的客户端。

class Figure{

    private int sides;

    /* package */ Figure(int num_sides){
        sides = num_sides;
    }

    public static Figure createFigure(int num_sides) {
        if (num_sides == 0) {
            return new Circle();
        } else if (num_sides == 4) {
            return new Square();
        }
        throw new IllegalArgumentException("Invalid number of sides");
    }
}


class Circle extends Figure{

    public Circle(){
        super(0);
    }

}

class Square extends Figure{

    public Square(){
        super(4);
    }

}

答案 3 :(得分:2)

您使用的IF不是嵌套的,嵌套的示例如果是:

if(condition1) {
    if(con2)
        //body
}

在性能方面,通常使用更好:switch-case。既然在这里你没有这么多的情况,else if就可以做到这一点,但是要知道,由于JVM,switch在更多情况下效率更高。

答案 4 :(得分:1)

我会按建议使用Factory设计模式,但是我也会在边数为&gt;的情况下制作一个通用构造函数。 0以边数作为参数。想一想:您可以将360度或2个PI rad除以边数,并将角绘制在虚拟圆上。重复使用您的代码并使所有可能的边数都成为可能,圆圈为0的显着例外。

答案 5 :(得分:1)

您的方法建议您有一个具有属性的类,该属性确定要创建的图的边数,而不是每个图的单独类。然后向用户询问边数是否合理,你可以将数字传递给你的Multigon的构造函数并完成它。这似乎是更好的模型,因为没有专业化或扩展需要考虑,只是一个不同的数量。你的数字都属于同一类,它们都是以连续的方式分成几个步骤。耙子将是一个不同的类别,就像一个十字架。

此外,我认为圆圈有一面。一条线有两个(将被绘制和向后),下一个将是三角形。零将是一个点。

但是要回答你的问题,switch语句会比if更好。毕竟,你想处理案件,而不是条件。