java - 根据用户输入决定调用什么构造函数

标签 java oop inheritance

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

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

所有类都扩展了 Figure 类。

类图:

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

主要类:

import java.util.Scanner;

class Draw {

   static void main(String[] args){

       Scanner userInput = new Scanner(System.in);
       int num_sides;

       //user input
       System.out.println("How many sides has the figure you want to draw?");   
       num_sides = userInput.nextInt();


       //---> deciding what constructor to call with if statements

       if(num_sides == 0){
          Figure f1 = new Circle();
       }
       else if(num_sides == 3){
          Figure f1 = new Triangle(); 
       }
       //...
       else{
          System.out.println("Error. Invalid sides number");
       }


   }
}

类(class)代码:

class Figure{

    private int sides;

    public Figure(int num_sides){
       sides = num_sides;
    }
}


class Circle extends Figure{

   public Circle(){
      super(0);
   }

}

//... all the other classes has the same structure of Circle

最佳答案

工厂方法

您是否考虑过 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;
}

然后让那个工厂方法来做决定。

关于java - 根据用户输入决定调用什么构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34519878/

相关文章:

javascript - 如何在 Javascript 中更改函数内部变量的值?

c# - 服务 - 客户端界面、架构建议

C++继承与重载,重载后调用基方法

java - 在 Java Swing 中打印发票和类似文档的工具是什么?

java - hibernate 的奇怪行为

java - 重写内部FrameClosing方法

c# - 辅助类/存储类的内聚力低,这真的是错误的吗?

oop - 替换嵌套 if 语句的设计模式(箭头反模式)

C++ : calling an abstract base class constructor/undefined symbol in shared object

java - Netty大POJO传输错误: TooLongFrameException